MongoDB SELECT COUNT GROUP BY


180

我正在与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++;
    }
});

但是使用聚合函数是否有更简单/更快的方法?

Answers:


326

使用aggregate以下方法将是更简单的方法:

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

1
我尝试这样"errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",做时会收到错误消息?
2014年

您如何分组排序?我想排序-1计数
菲利普Bartuzi

4
@FilipBartuzi在文档页面中有一个示例,您必须在管道中添加排序操作,例如{ $sort: { count: -1 } }
elaich

我有与@Steven相同的异常,这是因为我仅复制粘贴了第2行,并省略了周围的方括号。
PeterPerháč18年

请,如果你能在MongoDB的相关问题的帮助- stackoverflow.com/questions/61067856/...
newdeveloper

66

根据聚合函数的结果,我需要一些额外的操作。最后,基于MongoDB中的结果,我找到了一些针对聚合函数和运算的解决方案。我有一个Request关于field 的收藏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}}
])

多个字段分组和计数,并使用计数进行排序:

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

50

如果需要多个列进行分组,请遵循此模型。在这里,我通过status和进行计数type

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

2
_id代表用于封装多个字段的默认参数?
Eugen Sunic '18

18

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

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

17

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

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

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

例如:

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

2
在这里可能值得注意的是,$sortByCount它实际上是一个“伪运算符”,就像从MongoDB 3.4中引入的几个聚合阶段运算符一样。他们真正要做的只是扩展到各自的聚合阶段。在这种情况下$group$sum: 1如现有答案中所示,还有一个附加$sort 阶段。它们除了“键入更少的代码”之外没有其他优势,后者可能更具描述性(如果您喜欢这种类型的话)。恕我直言,代码中的不同部分$group$sort阶段更具描述性,并且实际上更加灵活。
尼尔·伦


0

对我有用的Mongo Shell命令:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.