Mongodb聚合-计算具有大于整数值的元素的数组

时间:2019-06-20 16:54:36

标签: mongodb

我需要编写一个MongoDB聚合管道来对具有包含两种类型的值的数组的对象进行计数:

  • > = 10
  • > = 20

这是我的数据集:

[
 { values: [ 1, 2, 3] },
 { values: [12, 1, 3] },
 { values: [1, 21, 3] },
 { values: [1, 2, 29] },
 { values: [22, 9, 2] }
]

这将是预期的输出

{
  has10s: 4,
  has20s: 3
}

Mongo的$in (aggregation)似乎是完成任务的工具,但我无法使其正常工作。

这是我的(无效)管道:

db.mytable.aggregate([
  {
    $project: {
      "has10s" : { 
         "$in": [ { "$gte" : [10, "$$CURRENT"]}, "$values"]} 
    },
     "has20s" : { 
         "$in": [ { "$gte" : [20, "$$CURRENT"]}, "$values"]} 
    }
  },
  { $group: { ... sum ... } }
])

$ in的输出似乎总是正确的。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

db.collection.aggregate([{
    $project: {
      _id: 0,
      has10: {
        $size: {
          $filter: {
            input: "$values",
            as: "item",
            cond: { $gte: [ "$$item", 10 ] }
          }
        }
      },
      has20: {
        $size: {
          $filter: {
            input: "$values",
            as: "item",
            cond: { $gte: [ "$$item", 20 ] }
          }
        }
      }
    }
  },
  {
    $group: {
      _id: 1,
      has10: { $sum: "$has10" },
      has20: { $sum: "$has20" }
    }
  }
])

使用$project$filter来获取实际元素,然后通过$size来获取数组长度。

查看working here