【问题标题】:How to Count Matched array elements如何计算匹配的数组元素
【发布时间】:2017-10-21 04:54:20
【问题描述】:

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

China, USA, Australia

并且输出应该显示每个文档具有的上述国家的数量。 我使用以下聚合命令:

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

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    $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" ] }
    

    您需要将2 计算为"USA",而不是1,这将是$setIntersection 的“设置”结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2018-01-27
      • 2014-06-12
      • 2021-12-21
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多