MongoDB SELECT COUNT GROUP BY

时间:2014-04-16 17:34:53

标签: mongodb group-by

我正在玩MongoDB试图弄清楚如何做一个简单的

SELECT province, COUNT(*) FROM contest GROUP BY province

但我似乎无法使用聚合函数来解决这个问题。我可以使用一些非常奇怪的组语法

来做到这一点
db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

但使用聚合函数是否有更容易/更快的方式?

9 个答案:

答案 0 :(得分:239)

使用aggregate

这是更简单的方法
db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

答案 1 :(得分:38)

如果您需要多个列进行分组,请遵循此模型。在这里,我按statustype进行了统计:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

答案 2 :(得分:35)

我需要根据聚合函数的结果进行一些额外的操作。最后,我发现了一些基于MongoDB结果的聚合函数和操作的解决方案。我的收藏集Request的字段为request, source, status, requestDate

单场组和&数:

db.Request.aggregate([
    {"$group" : {_id:"$source", count:{$sum:1}}}
])

多个字段分组&数:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

多个字段分组&使用字段排序计数:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

多个字段分组&使用Count计算排序:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])

答案 3 :(得分:11)

此外,如果您需要限制分组,可以使用:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

答案 4 :(得分:7)

这种查询对我有用:

 db.events.aggregate({$group: {_id : "$date", number:  { $sum : 1} }} )

请参阅http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/

答案 5 :(得分:1)

从MongoDB 3.4开始,您可以使用$sortByCount聚合。

  

根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档数。

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

例如:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);

答案 6 :(得分:0)

对我有用的Mongo shell命令:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])

答案 7 :(得分:0)

    db.contest.aggregate([
        { $match:{.....May be some match criteria...}},
        { $project: {"province":1,_id:0}},
        { $sortByCount: "$province" }
    ],{allowDiskUse:true});

MongoDB 对内存排序操作有 32 MB 的限制,使用 allowDiskUse : true 这个选项,当你在数百万数据之前公开这个查询时,它将在磁盘级别而不是内存中排序。 MongoDB 聚合管道有 100MB 的限制,因此使用 $project 来减少流向下一个管道的数据。 如果您使用的是小数据,则无需使用 allowDiskUse 选项。

答案 8 :(得分:0)

Mongo 5.0 release schedule 开始,我们还可以使用 { $count: { } } 作为 { $sum : 1 } 的别名:

// { "province" : "Champagne-Ardenne" }
// { "province" : "Champagne-Ardenne" }
// { "province" : "Haute-Normandie"   }
db.collection.aggregate([
  { $group: { _id: "$province", count: { $count: {} } } }
])
// { "_id" : "Champagne-Ardenne", "count" : 2 }
// { "_id" : "Haute-Normandie",   "count" : 1 }