我正在玩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++;
}
});
但使用聚合函数是否有更容易/更快的方式?
答案 0 :(得分:239)
使用aggregate
:
db.contest.aggregate([
{"$group" : {_id:"$province", count:{$sum:1}}}
])
答案 1 :(得分:38)
如果您需要多个列进行分组,请遵循此模型。在这里,我按status
和type
进行了统计:
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 }