计算与给定条件匹配的Elements SubDocument

时间:2016-09-21 15:19:18

标签: mongodb mongodb-query aggregation-framework mongodb-aggregation

我在mongodb中有以下文档结构

{
    "_id" : "123",
    "first_name" : "Lorem",
    "last_name" : "Ipsum",
    "conversations" : {
            "personal" : [
                    {
                            "last_message" : "Hello bar",
                            "last_read" : 1474456404
                    },
                     {
                            "last_message" : "Hello foo",
                            "last_read" : 1474456404
                    },
                    ...
            ],

            "group" : [
                    {
                            "last_message" : "Hello Everyone",
                            "last_read" : null
                    }
                    ...
            ]
    }
}

我想计算给定用户的子数组personalgroup的会话数,其中last_read为空。请问我该怎么做?

我试过了:

db.messages.aggregate(
   [
    { $match: {"_id":"123", 'conversations.$.last_read': null }},
      {
         $group: {
            {$size: "$conversations.personal"}, {$size: "$conversations.group"}
         }
      }
   ]
);

但没有得到他想要的输出。还有什么更好的想法吗?

2 个答案:

答案 0 :(得分:1)

以下查询计算具有personalgroup的{​​{1}}和last_read数组下的子文档数。

null将多个数组合并为一个数组。它是在MongoDB 3.2中引入的。

$concatArrays

示例结果:

db.collection.aggregate([
                        { "$match": {"_id":"123", 'conversations.$.last_read': null }},
                        { "$project":{"messages":{$concatArrays : ["$conversations.personal","$conversations.group"]}}}, 
                        { "$unwind": "$messages"}, {$match:{"messages.last_read": null}}, 
                        { "$group":{"_id":null, count: {$sum:1}}}
                ])

答案 1 :(得分:0)

根据问题,您似乎想要找出group array last_read包含null的位置。为此,您在聚合中使用$in,然后使用unwind personal数组并计算数组。检查以下聚合查询

db.collection.aggregate({
    "$match": {
        "conversations.group.last_read": {
            "$in": [null]
        }
    }
}, {
    "$unwind": "$conversations.personal"
}, {
    "$group": {
        "_id": "$_id",
        "personalArrayCount": {
            "$sum": 1
        }
    }
})