具有计数和条件的不同值mongo DB

时间:2015-08-10 10:34:06

标签: regex mongodb count group-by aggregation-framework

我是MongoDB的新手,到目前为止,它似乎试图摆脱它让简单的事情变得过于复杂。

我正在尝试运行以下MYSQL等效项

SELECT userid, COUNT(*) 
FROM userinfo 
WHERE userdata like '%PC% or userdata like '%wire%' 
GROUP BY userid

我有mongo 3.0.4版,我正在运行MongoChef。 我尝试使用类似下面的内容:

 db.userinfo.group({
"key": {
    "userid": true
},
"initial": {
    "countstar": 0
},
"reduce": function(obj, prev) {
 prev.countstar++;
},
"cond": {
    "$or": [{
        "userdata": /PC/
    }, {
        "userdata": /wire/
    }]
}
});

但是那不喜欢OR。 当我拿出OR时,我想我会一次做一半并将结果合并到excel中,我得到一个错误" group()无法处理超过20000个唯一键"和结果表应该比那个大得多。

从我在网上可以看出,我可以使用聚合管道来做到这一点,但我找不到任何明确的例子来说明这一点。

这似乎应该是一个简单的东西应该内置到任何数据库中,对我来说没有意义。 非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

/

作品" sooo"使用.aggregate()方法要好得多,因为.group()是一种过时的方法:

db.userinfo.aggregate([
   { "$match": {
         "userdata": { "$in":[/PC/,/wire/] }
   }},
   { "$group": {
       "_id": "$userid",
       "count": { "$sum": 1 }
   }} 
])

这里$in是一种更短的编写$or条件的方式。

这是本机代码,而不是JavaScript转换,因此运行速度更快。

答案 1 :(得分:0)

这里是一个示例,它计算last_name值为“ smith”的记录的first_name值的不同数量:

  

db.collection.distinct(“ first_name”,{“ last_name”:“ smith”})。length;

     

输出   3