我有一个名为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的聚合机制。theadId
并创建一个threadId
字段并使用
管道中count
的条件,并用光标迭代。但是现在我想知道有多少 unReplied 线程,我认为迭代上面的count==1
不是一个好主意。因为我必须遍历整个游标,直到没有更多的记录来知道 unReplied 线程的总数。这很贵。
有更优雅的方法吗?或者有没有一种方法可以知道聚合记录的数量,而无需迭代光标?
答案 0 :(得分:1)
您的逻辑似乎是整个会话使用相同的“threadId”,因此初始消息会创建“threadId”,当然它具有自己的_id
值。然后,响应中的每个“子”都会在“父”字段中引用它前面的注释的_id
,依此类推。
基本上,每个会话都由自己的“threadId”定义,而“未读”的会话只有“one”项,没有“parentId”。
然后聚合逻辑是:
在聚合管道中,您只需执行“三个”相同的步骤:
db.comment.aggregate([
{ "$group": {
"_id": "$threadId",
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } } },
{ "$group": {
"_id": null,
"count": { "$sum": 1 }
}}
])