gpt4 book ai didi

mongodb - 如何计算匹配的数组元素

转载 作者:可可西里 更新时间:2023-11-01 09:57:39 26 4
gpt4 key购买 nike

我有一个集合,该集合中的每个文档都有一个数组字段 countries。我想选择包含以下任何国家/地区的所有文档:

中国、美国、澳大利亚

并且输出应显示每个文档包含的上述国家/地区的数量。我使用以下聚合命令:

db.movies.aggregate([
{
$match: { countries: { $in: ["USA", 'China', 'Australia'] } }
},
{
$project: {
countries: {$size: '$countries'}
}
}
]);

它没有按预期工作。它显示文档中具有上述国家/地区的所有国家/地区的数量。例如,如果文档的 countries 字段中有 China, Japan,我希望它返回 1(因为只有 China 在上述国家/地区列表)但它返回两个。我如何在聚合命令中执行此操作?

最佳答案

$in 运算符只是“查询”包含可能值之一的文档,因此它不会从数组中删除任何内容。

如果你想计算“只匹配”,那么将 $setIntersection 应用于 $size 之前的数组:

db.movies.aggregate([
{
$match: { countries: { $in: ["USA", 'China', 'Australia'] } }
},
{
$project: {
countries: {
$size: {
"$setIntersection": [["USA", 'China', 'Australia'], '$countries' ]
}
}
}
]);

这会将“唯一”匹配项的“集合”返回到针对文档中的数组提供的数组。

在现代版本(至少 MongoDB 3.4)中有 $in 的替代作为聚合运算符。这在针对值数组“测试”“单一”值时有点不同。在数组比较中,您将应用 $filter :

db.movies.aggregate([
{
$match: { countries: { $in: ["USA", 'China', 'Australia'] } }
},
{
$project: {
countries: {
$size: {
$filter: {
input: '$countries',
cond: { '$in': [ '$$this', ["USA", 'China', 'Australia'] ] }
}
}
}
}
]);

只有当“在文档中”的数组包含不唯一的条目时,这对您才真正重要。即:

{ countries: [ "USA", "Japan", "USA" ] }

并且您需要为 "USA" 计算 2,而不是 1,后者将是 $setIntersection < 的“设置”结果/p>

关于mongodb - 如何计算匹配的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46860177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com