我希望在用户是对话成员的所有对话中统计未读消息。如果用户的id在读取器阵列中,则用户读取该消息。
以下内容返回存在未读邮件的会话数。但是如何计算所有未读消息?
db.getCollection('conversations').count({
'messages.readers': { $size: 1 }, //i.e. only the message author is in the message.readers array.
'members': { $in: [ObjectId("59320e38188c5050ac99be8f")] }
})
我已经检查了汇总方法,但我不确定它是否是正确的方法。以下内容返回所有消息的数量。
db.getCollection('conversations').aggregate([
{$match : {
'members': { $in: [ObjectId("59320e38188c5050ac99be8f")] }
}},
{$group: {_id: null, count: {$sum: {$size: "$messages"}}}},
])
答案 0 :(得分:0)
您可以尝试以下聚合管道。
以下查询将$unwind
每个匹配对话中的所有消息,并在$cond
运算符内应用$sum
表达式,以检查用户是否不在messages.readers
并返回如果匹配则为1,或者$group
阶段为0。
db.getCollection('conversations').aggregate([
{$match : {'members': ObjectId("59320e38188c5050ac99be8f") }},
{$unwind : "$messages"},
{$group: {_id: null, count: {$sum: {$cond: [{ $ne: ["messages.readers", ObjectId("59320e38188c5050ac99be8f")] }, 1, 0]}}}}
])
因此,$unwind
是一项昂贵的操作,不应该优先于其他选项,但我认为在您的情况下不可能并且$unwind
跟$match
之后很少更好。