计算总的未回复消息

时间:2015-07-20 05:00:40

标签: mongodb mongodb-query aggregation-framework

我有一个名为comment的集合,其中包含用户注释,其设计结构如下:

{
  "_id":ObjectId("53b76888e4b01917be0a7a76");
  "username":"Bob",
  "content":"That is very good for me :D",
  "threadId":"5c9597f3c8245907ea71a89d9d39d08e",
  "parent":""
}

收藏中有很多评论,对前评论的回复会生成一条新评论,其parent将成为前评论的_id,并且它们将具有相同的{{1} }}。如果评论是线程的 init 评论(这意味着它没有回复任何以前的评论, unReplied threadId字段init 注释将标记为空字符串parent

  • 我可以在同一""的聚合中检索评论 mongodb的聚合机制。
  • 我甚至可以通过分组检索所有 unReplied 线程 theadId并创建一个threadId字段并使用 管道中count的条件,并用光标迭代。

但是现在我想知道有多少 unReplied 线程,我认为迭代上面的count==1不是一个好主意。因为我必须遍历整个游标,直到没有更多的记录来知道 unReplied 线程的总数。这很贵。

有更优雅的方法吗?或者有没有一种方法可以知道聚合记录的数量,而无需迭代光标?

1 个答案:

答案 0 :(得分:1)

您的逻辑似乎是整个会话使用相同的“threadId”,因此初始消息会创建“threadId”,当然它具有自己的_id值。然后,响应中的每个“子”都会在“父”字段中引用它前面的注释的_id,依此类推。

基本上,每个会话都由自己的“threadId”定义,而“未读”的会话只有“one”项,没有“parentId”。

然后聚合逻辑是:

  1. 计算每个帖子中的消息数
  2. 丢弃“计数”超过1
  3. 的人
  4. 计算这些不同的消息以获取未读数
  5. 在聚合管道中,您只需执行“三个”相同的步骤:

     db.comment.aggregate([
        { "$group": {
            "_id": "$threadId",
            "count": { "$sum": 1 }
        }},
        { "$match": { "count": { "$gt": 1 } } },
        { "$group": {
            "_id": null,
            "count": { "$sum": 1 }
        }}
    ])
    

    因此$group在“threadId”上,$match过滤了计算结果,然后再次$group来删除剩余的数量。