Mongo 计算一组文档中每个值的出现次数
Mongo count occurrences of each value for a set of documents
我有一些这样的文档:
{
"user": '1'
},
{ "user": '1'
},
{
"user": '2'
},
{
"user": '3'
}
我希望能够获得一组所有不同的用户及其各自的计数,并按降序排列。所以我的输出会是这样的:
{
'1': 2,
'2': 1,
'3': 1
}
我认为这可以通过 Mongo aggregate() 来完成,但是我在确定正确的流程时遇到了很多麻烦。
您可以通过 aggregation
获得结果(不是您要求的格式)
db.collection.aggregate(
{$group : { _id : '$user', count : {$sum : 1}}}
).result
示例文档的输出是:
"0" : {
"_id" : "2",
"count" : 1
},
"1" : {
"_id" : "3",
"count" : 1
},
"2" : {
"_id" : "1",
"count" : 2
}
对于 2019 年 1 月阅读本文的任何人,接受的答案目前在 Robo3T 中不起作用(returns pipeline.length - 1
错误)。
你必须:
a) 将查询包裹在一组方括号中 []
b) 从末尾删除 .result
https://github.com/Studio3T/robomongo/issues/1519#issuecomment-441348191
这是对@disposer 接受的答案的更新,适用于 Robo3T。
db.getCollection('collectionName').aggregate(
[ {$group : { _id : '$user', count : {$sum : 1}}} ]
)
使用 MongoDb 3.6 和更新版本,您可以利用 $arrayToObject
operator and a $replaceRoot
管道来获得所需的结果。您需要 运行 以下聚合管道:
db.collection.aggregate([
{ "$group": {
"_id": "$user",
"count": { "$sum": 1 }
} },
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": null,
"counts": {
"$push": {
"k": "$_id",
"v": "$count"
}
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
产生
{
"1" : 2,
"2" : 1,
"3" : 1
}
您可以使用下面的聚合查询,它还会根据需要对结果进行降序排序。
db.collection.aggregate([
{ $group: { _id: "$user", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])
我有一些这样的文档:
{
"user": '1'
},
{ "user": '1'
},
{
"user": '2'
},
{
"user": '3'
}
我希望能够获得一组所有不同的用户及其各自的计数,并按降序排列。所以我的输出会是这样的:
{
'1': 2,
'2': 1,
'3': 1
}
我认为这可以通过 Mongo aggregate() 来完成,但是我在确定正确的流程时遇到了很多麻烦。
您可以通过 aggregation
获得结果(不是您要求的格式)db.collection.aggregate(
{$group : { _id : '$user', count : {$sum : 1}}}
).result
示例文档的输出是:
"0" : {
"_id" : "2",
"count" : 1
},
"1" : {
"_id" : "3",
"count" : 1
},
"2" : {
"_id" : "1",
"count" : 2
}
对于 2019 年 1 月阅读本文的任何人,接受的答案目前在 Robo3T 中不起作用(returns pipeline.length - 1
错误)。
你必须:
a) 将查询包裹在一组方括号中 []
b) 从末尾删除 .result
https://github.com/Studio3T/robomongo/issues/1519#issuecomment-441348191
这是对@disposer 接受的答案的更新,适用于 Robo3T。
db.getCollection('collectionName').aggregate(
[ {$group : { _id : '$user', count : {$sum : 1}}} ]
)
使用 MongoDb 3.6 和更新版本,您可以利用 $arrayToObject
operator and a $replaceRoot
管道来获得所需的结果。您需要 运行 以下聚合管道:
db.collection.aggregate([
{ "$group": {
"_id": "$user",
"count": { "$sum": 1 }
} },
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": null,
"counts": {
"$push": {
"k": "$_id",
"v": "$count"
}
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
产生
{
"1" : 2,
"2" : 1,
"3" : 1
}
您可以使用下面的聚合查询,它还会根据需要对结果进行降序排序。
db.collection.aggregate([
{ $group: { _id: "$user", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])