总和子阵列的长度

时间:2017-06-03 20:05:39

标签: mongodb

我希望在用户是对话成员的所有对话中统计未读消息。如果用户的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"}}}}, 
])

enter image description here

1 个答案:

答案 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之后很少更好。