2014-10-17 222 views
0

我无法理解MongoDB的聚合框架。基本上我的JSON是这样的:Mongo聚合和n个字段计数

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

我想看看有多少文件有,例如,参数1 ==真,参数2 ==真等。 在这种情况下,预期的结果应该是:

count_param1: 2 
count_param2: 1 
count_param3: 1 

这里的窍门是PARAM可以是参数1 .. paramN,所以基本上我要么需要做一个独特的和确切指定哪些字段IM感兴趣的还是可以的我以“参数”开头的所有字段上的“组”。

推荐的方法是什么?


进一步解释:

的SQL相当于是做:

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

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

回答

0

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

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

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万个+行,这将是更好地做到每PARAM NAME一个聚合管道。我并不熟悉SQL,但是我猜测,当你给出SQL的等价物并且说你会在“一个查询”中完成它们时,你意味着你会发送一批SQL,但它本质上是一个串联对不同的查询进行分组和统计,因此与我提供的解决方案没有多大区别。

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

+0

试过了。一个没有索引的param_count在300000个文档中花费了0.2秒。太慢了。 – Norrin 2014-10-17 18:56:42