Mongodb聚合集合

时间:2014-09-05 21:33:40

标签: mongodb mongodb-query aggregation-framework

我在mongodb学习聚合。我正在使用该系列:

                    {
                            "body" : ""
     ,
                    "email" : "oJJFLCfA@qqlBNdpY.com",
                    "author" : "Linnie Weigel"
            },
            {
                    "body" : ""
     ,
                    "email" : "ptHfegMX@WgxhlEeV.com",
                    "author" : "Dinah Sauve"
            },
            {
                    "body" : ""
    ,
                    "email" : "kfPmikkG@SBxfJifD.com",
                    "author" : "Zachary Langlais"
            }
            {
                    "body" : ""
     ,
                    "email" : "gqEMQEYg@iiBqZCez.com",
                    "author" : "Jesusa Rickenbacker"
            }
    ]

我试图获得每个作者的身体数量。但是当我执行聚合mongodb的命令sum时,结果为1(因为结构只有一个元素)。我怎么做这个操作?我尝试使用$ addToSet。但我不知道如何获得收集的每个元素并进行操作。

1 个答案:

答案 0 :(得分:2)

为了计算每个作者的评论,您想要$group作者和$sum出现的评论。基本上只是一个“$ sum:1”操作。但是,根据您自己的评论和部分数据列表中的结束括号,您似乎在此处将“注释”作为数组。为此,您需要首先使用$unwind进行处理:

db.collection.aggregate([
   { "$unwind": "$comments" },
   { "$group": {
       "_id": "$comments.author",
       "count": { "$sum": 1 }
   }}
])

这将获得作者对整个集合的所有作者评论的总和。如果您刚刚获得每个文档的作者的总评论(或看起来像博客文章模型),那么您使用文档_id作为组声明的一部分:

db.collection.aggregate([
   { "$unwind": "$comments" },
   { "$group": {
       "_id": {
           "_id": "$_id"
           "author": "$comments.author"
       },
       "count": { "$sum": 1 }
   }}
])

如果您希望每个文档的作者计数摘要只包含一个与数组中所有作者一起返回的单个文档,那么请使用此处的$addToSet,以及另一个$group管道阶段:< / p>

db.collection.aggregate([
   { "$unwind": "$comments" },
   { "$group": {
       "_id": {
           "_id": "$_id"
           "author": "$comments.author"
       },
       "count": { "$sum": 1 }
   }},
   { "$group": {
       "_id": "$_id._id",
       "comments": {
           "$addToSet": {
               "author": "$_id.author",
               "count": "$count"
           }
       }
   }}
])

但实际上,作者的值已经是唯一的,并且“sets”没有以任何方式排序,因此您可以在首次引入$push之后使用$sort更改此值以使列表按顺序排序发表的评论数量:

db.collection.aggregate([
   { "$unwind": "$comments" },
   { "$group": {
       "_id": {
           "_id": "$_id"
           "author": "$comments.author"
       },
       "count": { "$sum": 1 }
   }},
   { "$sort": { "_id._id": 1, "count": -1 } },
   { "$group": {
       "_id": "$_id._id",
       "comments": {
           "$push": {
               "author": "$_id.author",
               "count": "$count"
           }
       }
   }}
])