Mongo计算一组文档的每个值的出现次数

rit*_*ter 37 mongodb mongodb-query

我有一些这样的文件:

{
  "user": '1'
},
{ "user": '1'
},
{
  "user": '2'
},
{
  "user": '3'
}
Run Code Online (Sandbox Code Playgroud)

我希望能够获得一组所有不同的用户及其各自的计数,按降序排序.所以我的输出将是这样的:

{
  '1': 2,
  '2': 1,
  '3': 1
}
Run Code Online (Sandbox Code Playgroud)

我认为这可以通过Mongo aggregate()来完成,但是我在为此找出正确的流程时遇到了很多麻烦.

Dis*_*ser 54

您可以通过聚合获得结果(不是您所需的格式)

db.collection.aggregate(
   {$group : { _id : '$user', count : {$sum : 1}}}
).result
Run Code Online (Sandbox Code Playgroud)

示例文档的输出是:

"0" : {
    "_id" : "2",
    "count" : 1
},
"1" : {
    "_id" : "3",
    "count" : 1
},
"2" : {
    "_id" : "1",
    "count" : 2
}
Run Code Online (Sandbox Code Playgroud)

  • 为我工作,但我必须删除.result。我从Robomongo像`db.getCollection('MyColection')。aggregate({$ group:{_id:'$ post.source',cant:{$ sum:1}}})运行它 (2认同)

Ree*_*els 12

对于在2019年1月阅读此内容的任何人,当前接受的答案目前在Robo3T中不起作用(返回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}}} ]
)
Run Code Online (Sandbox Code Playgroud)


chr*_*dam 8

使用 MongoDb 3.6 及更新版本,您可以利用$arrayToObject运算符和$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" }
    } }    
])
Run Code Online (Sandbox Code Playgroud)

这产生

{
    "1" : 2,
    "2" : 1,
    "3" : 1
}
Run Code Online (Sandbox Code Playgroud)


Raj*_*tam 5

您可以使用下面的聚合查询,它还会根据需要按降序对结果进行排序。

db.collection.aggregate([
    { $group: { _id: "$user", count: { $sum: 1 } } },
    { $sort: { count: -1 } }
  ])
Run Code Online (Sandbox Code Playgroud)