MongoDB选择计数组

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

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

410563 次浏览

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

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/

如果需要根据多个列进行分组,请遵循此模型。这里我正在执行statustype的计数:

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

根据聚合函数的结果,我需要做一些额外的操作。最后,基于MongoDB中的结果,对聚合函数和操作找到了一些解决方案。我有一个包含字段request, source, status, requestDate的集合Request

单场组&数:

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

多字段分组数:

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

多字段分组使用Field进行计数排序:

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}}
])

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

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

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

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

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

例如:

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

Mongo shell命令,为我工作:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
    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选项

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 }