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

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


当前回答

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

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

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

例如:

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

其他回答

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

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

这种类型的查询适合我:

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

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

另外,如果你需要限制分组,你可以使用:

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

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

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

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

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

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

例如:

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