如何计算匹配的数组元素

时间:2017-10-21 04:54:20

标签: mongodb mongodb-query aggregation-framework

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

China, USA, Australia

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

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

它没有按预期工作。它显示了文档中具有上述国家/地区的所有国家/地区的数量。例如,如果某个文档的China, Japan字段中包含countries,我预计它会返回1(因为只有China位于上述国家/地区列表中),但它返回两个。我怎么能在聚合命令中做到这一点?

1 个答案:

答案 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

的结果