正在计算 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 评论(这意味着它没有回复任何以前的评论,unReplied) parent
init 注释的字段将被标记为空字符串 ""
.
- 我可以在相同
theadId
的聚合中检索评论
mongodb的聚合机制。
- 我什至可以检索所有 unReplied 线程,通过分组
threadId
并创建一个 count
字段并使用
管道中 count==1
的条件并使用游标进行迭代。
但现在我想知道有多少个 unReplied 线程,我认为迭代上面的 cursor
不是一个好主意。因为我必须遍历整个游标,直到没有更多记录才能知道 unReplied 线程的总数。太贵了。
有没有更优雅的方法来做到这一点?或者有没有办法不用遍历游标就知道聚合记录的数量?
您的逻辑似乎是整个对话使用相同的 "threadId",因此初始消息创建 "threadId" 当然是它自己的 _id
值。然后每个 "child" 响应在 "parent" 字段中引用它前面的评论的 _id
等等。
基本上,每个对话都由其自己的 "threadId" 定义,而 "unread" 对话只有 "one" 项,没有 "parentId".
那么这里的聚合逻辑是:
- 计算每个线程中有多少条消息
- 丢弃 "count" 大于 1
的
- 计算那些不同的消息以获得未读计数
在聚合管道中,您只需实施那些 "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
再次计算剩余人数。
我有一个名为 comment
的 collection,其中包含用户评论,其设计结构如下:
{
"_id":ObjectId("53b76888e4b01917be0a7a76");
"username":"Bob",
"content":"That is very good for me :D",
"threadId":"5c9597f3c8245907ea71a89d9d39d08e",
"parent":""
}
collection中有很多评论,回复之前的评论会生成一条新评论,parent
就是之前评论的_id
,他们会同threadId
。如果评论是线程的 init 评论(这意味着它没有回复任何以前的评论,unReplied) parent
init 注释的字段将被标记为空字符串 ""
.
- 我可以在相同
theadId
的聚合中检索评论 mongodb的聚合机制。 - 我什至可以检索所有 unReplied 线程,通过分组
threadId
并创建一个count
字段并使用 管道中count==1
的条件并使用游标进行迭代。
但现在我想知道有多少个 unReplied 线程,我认为迭代上面的 cursor
不是一个好主意。因为我必须遍历整个游标,直到没有更多记录才能知道 unReplied 线程的总数。太贵了。
有没有更优雅的方法来做到这一点?或者有没有办法不用遍历游标就知道聚合记录的数量?
您的逻辑似乎是整个对话使用相同的 "threadId",因此初始消息创建 "threadId" 当然是它自己的 _id
值。然后每个 "child" 响应在 "parent" 字段中引用它前面的评论的 _id
等等。
基本上,每个对话都由其自己的 "threadId" 定义,而 "unread" 对话只有 "one" 项,没有 "parentId".
那么这里的聚合逻辑是:
- 计算每个线程中有多少条消息
- 丢弃 "count" 大于 1 的
- 计算那些不同的消息以获得未读计数
在聚合管道中,您只需实施那些 "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
再次计算剩余人数。