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

68

我有一些这样的文件:

{
  "user": '1'
},
{ "user": '1'
},
{
  "user": '2'
},
{
  "user": '3'
}

我希望能够获得所有不同用户及其相应数量的集合,并按照递减顺序排序。因此,我的输出将类似于以下内容:

{
  '1': 2,
  '2': 1,
  '3': 1
}

我认为可以使用Mongo的aggregate()函数来完成,但是我在确定正确的流程方面遇到了很多困难。


通过聚合操作很容易得到答案(输出结果如下): "0" : { "_id" : "2", "count" : 1 }, "1" : { "_id" : "3", "count" : 1 }, "2" : { "_id" : "1", "count" : 2 } - Disposer
你会如何计算每个字段出现的次数? - ritmatter
@ritmatter使用两步聚合为相同的问题添加了一个答案。 - Rajdeep Gautam
4个回答

95

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

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
}

7
对我有用,但我必须删除.result。我是通过Robomongo运行它的,如下所示:db.getCollection('MyColection').aggregate({$group : { _id : '$post.source', cant: {$sum : 1}}}) - Rodrigo Laguna
@RodrigoLaguna,你的代码毫无意义。你是从自己的项目中复制粘贴过来的吗? - Vahid Amiri
1
是的,除了cant而不是count之外,它几乎相同。我认为将其映射到其他示例足够容易,所以我让它保持原样。 - Rodrigo Laguna

41

如果您在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}}} ]
)

11

使用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" }
    } }    
])

得出

{
    "1" : 2,
    "2" : 1,
    "3" : 1
}

5
您可以使用以下聚合查询,它还会按照所需的顺序将结果进行递减排序。
db.collection.aggregate([
    { $group: { _id: "$user", count: { $sum: 1 } } },
    { $sort: { count: -1 } }
  ])

1
抱歉,该答案的符号表示不正确。 - Ilya Pukhov
@IlyaPukhov,确实应该是:db.collection.aggregate([ { $group: { _id: "$user", count: { $sum: 1 } } }, { $sort: { count: -1 } }] - Tom O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接