我玩周围的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++;
    }
});

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


当前回答

从Mongo 5.0开始,我们还可以使用{$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 }

其他回答

这将是使用聚合更简单的方法:

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

如果需要根据多个列进行分组,请遵循此模型。在这里,我正在按状态和类型进行计数:

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

从Mongo 5.0开始,我们还可以使用{$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 }

根据聚合函数的结果,我需要做一些额外的操作。最后,基于MongoDB中的结果,对聚合函数和操作找到了一些解决方案。我有一个集合请求字段请求,来源,状态,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}}
])

Mongo shell命令,为我工作:

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