我有一个集合,该集合中的每个文档都有一个数组字段countries
。我想选择包含以下任何国家/地区的所有文件:
China, USA, Australia
输出应显示每个文档的上述国家/地区的数量。 我使用下面的聚合命令:
db.movies.aggregate([
{
$match: { countries: { $in: ["USA", 'China', 'Australia'] } }
},
{
$project: {
countries: {$size: '$countries'}
}
}
]);
它没有按预期工作。它显示了文档中具有上述国家/地区的所有国家/地区的数量。例如,如果某个文档的China, Japan
字段中包含countries
,我预计它会返回1(因为只有China
位于上述国家/地区列表中),但它返回两个。我怎么能在聚合命令中做到这一点?
答案 0 :(得分:6)
$in
运算符只是"查询"包含其中一个可能值的文档,因此它不会从数组中删除任何内容。
如果你想计算"只匹配"然后在$setIntersection
:
$size
应用于数组
db.movies.aggregate([
{
$match: { countries: { $in: ["USA", 'China', 'Australia'] } }
},
{
$project: {
countries: {
$size: {
"$setIntersection": [["USA", 'China', 'Australia'], '$countries' ]
}
}
}
]);
返回" set" "独特"匹配文档中针对数组提供的数组。
在现代版本中至少有$in
作为聚合运算符(至少MongoDB 3.4)。这在"测试"中有所不同。 a"单数"值对数组值。在数组比较中,您将使用$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" ] }
您需要为2
计算"USA"
,而不是1
,这将是" set" $setIntersection