Mongodb 如何计数匹配的数组元素
我有一个集合,集合中的每个文档都有一个数组字段Mongodb 如何计数匹配的数组元素,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个集合,集合中的每个文档都有一个数组字段countries。我想选择包含以下任何国家/地区的所有文档: 中国、美国、澳大利亚 并且输出应该显示每个文档包含的上述国家的数量。 我使用以下聚合命令: db.movies.aggregate([ { $match: { countries: { $in: ["USA", 'China', 'Australia'] } } }, { $project: { countries: {$size: '$count
countries
。我想选择包含以下任何国家/地区的所有文档:
中国、美国、澳大利亚
并且输出应该显示每个文档包含的上述国家的数量。
我使用以下聚合命令:
db.movies.aggregate([
{
$match: { countries: { $in: ["USA", 'China', 'Australia'] } }
},
{
$project: {
countries: {$size: '$countries'}
}
}
]);
它没有按预期工作。它显示文档中拥有上述国家/地区的所有国家/地区的数量。例如,如果文档的国家/地区字段中有中国、日本
,我希望它返回1(因为上面的国家/地区列表中只有中国
),但它返回2。如何在aggregation命令中执行此操作?操作符只“查询”包含一个可能值的文档,因此它不会从数组中删除任何内容
如果要计算“仅匹配项”,请在执行以下操作之前应用于数组:
将“唯一”匹配项的“集”返回给针对文档中的数组提供的数组
在现代版本中,有一个替代的作为聚合操作符(至少是MongoDB 3.4)。这在“测试”一个“奇异”值和一个值数组时有点不同。在数组比较中,您将应用:
只有当数组“在文档中”包含不唯一的条目时,这才应该对您很重要。i、 e:
{ countries: [ "USA", "Japan", "USA" ] }
您需要为“USA”
计算2
,而不是1
,后者将是
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" ] }