Mongo聚合并计算n个字段

时间:2014-10-17 08:14:36

标签: mongodb aggregation-framework

我无法理解MongoDB的聚合框架。基本上我的JSON看起来像这样:

[
  {
    "id": 1,
    "param1": true,
    "param2": false,
    "param3": false
  },
  {
    "id": 2,
    "param1": true,
    "param2": false,
    "param3": true
  },
  {
    "id": 3,
    "param1": false,
    "param2": true,
    "param3": false
  }
]

我想计算有多少文档,例如,param1 == true,param2 == true等等。 在这种情况下,预期结果应为:

count_param1: 2
count_param2: 1
count_param3: 1

这里的诀窍是param可以是param1 ... paramN,所以基本上我要么做一个不同的并且确切地指定我感兴趣的字段,或者我可以“分组”所有以“param”开头的字段。

推荐的方法是什么?


进一步解释:

SQL的等价物是:

SELECT COUNT(param1) AS param1
FROM [Table]
GROUP BY param1

对于每一列(但在一个查询中)。

2 个答案:

答案 0 :(得分:0)

我不会使用聚合,因为有一个内置帮助器count()

> db.collection.count({ "param1" : true })

您可以创建一个简单的函数,将参数名称作为参数并返回计数:

> param_count = function(param_name) {
    count_obj = {}
    count_obj[param_name] = true
    return db.collection.count(count_obj)
}

虽然技术上可以在一个聚合管道中获取所有参数的计数,但是对于100万个行来说它是不可行的,并且每个参数名称做一个聚合管道会更好。我并不精通SQL,但我猜你什么时候给SQL等价,并且说你在#34;一个查询"你的意思是你发送了一批SQL,但它实际上是不同查询的串联和计数的串联,所以它与我给出的解决方案没什么不同。

如果存在,则计数可以使用paramN上的索引。

答案 1 :(得分:0)

这已经解决了。 查看我的相关question和chridam的优秀答案。

满足我需求的完美解决方案。