正在计算 un-reply 封邮件总数

Counting total un-reply messages

我有一个名为 comment 的 collection,其中包含用户评论,其设计结构如下:

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

collection中有很多评论,回复之前的评论会生成一条新评论,parent就是之前评论的_id,他们会同threadId。如果评论是线程的 init 评论(这意味着它没有回复任何以前的评论,unRepliedparent init 注释的字段将被标记为空字符串 "".

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

有没有更优雅的方法来做到这一点?或者有没有办法不用遍历游标就知道聚合记录的数量?

您的逻辑似乎是整个对话使用相同的 "threadId",因此初始消息创建 "threadId" 当然是它自己的 _id 值。然后每个 "child" 响应在 "parent" 字段中引用它前面的评论的 _id 等等。

基本上,每个对话都由其自己的 "threadId" 定义,而 "unread" 对话只有 "one" 项,没有 "parentId".

那么这里的聚合逻辑是:

  1. 计算每个线程中有多少条消息
  2. 丢弃 "count" 大于 1
  3. 计算那些不同的消息以获得未读计数

在聚合管道中,您只需实施那些 "three" 相同的步骤:

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

所以 $group on "threadId", $match to filter the counted results, then $group 再次计算剩余人数。