如何计算mongodb条件下的多维数组?

时间:2016-07-12 14:18:56

标签: mongodb aggregation-framework

我有mongo文档chatMessages为

{
    "_id" : ObjectId("5784dcd9db2c60b54b8b45d3"),
    "sender_id" : "55505ad6b5a0925f4c8b7707",
    "receivers_id" : [
        "57715368db2c60e5208b4579"
    ],
    "messages" : [
        {
            "_id" : ObjectId("5784e0fadb2c605c6d8b4578"),
            "sender" : "57715368db2c60e5208b4579",
            "message" : "hai",
            "send_at" : NumberLong(1468326138),
            "read_by" : [
                {
                    "user" : "55505ad6b5a0925f4c8b7707",
                    "at" : NumberLong(0)
                }
            ]
        }       
    ],
    "updated_at" : NumberLong(1468327157),
    "created_at" : NumberLong(1468327157)
}

我需要从上面的文档中找到完整的未读消息。 假设我当前的user_id是55505ad6b5a0925f4c8b7707。我被困在某处以获得结果。所以帮帮我们

  

更新

$unread_messages = ChatMessages::find([
        'conditions' => [
            '$or' => [
                ['sender_id' => $user_id],
                ['receivers_id' => ['$elemMatch' => ['$eq' => $user_id]]]
            ],
            'messages.sender' => ['$ne' => $user_id]
        ]
    ]);

首先这个查询应该显示一些结果,但我收到空值

1 个答案:

答案 0 :(得分:1)

作为$or operator的手册,您之前不需要conditions。例如,在mongo shell中:

db.chats.find(
              {$or:[
                    {'sender_id': "55505ad6b5a0925f4c8b7707"}, 
                    {'receivers_id':{ $elemMatch:{ $eq:"55505ad6b5a0925f4c8b7707" } } }
                   ], 
              'messages.sender':{ $ne:"55505ad6b5a0925f4c8b7707" }
              }
)

您可以结合aggregation pipeline$match$unwind使用$sum。例如,要匹配和展开:

db.chats.aggregate([
                  {$match: 
                       {$or:[
                             {'sender_id': 1}, 
                             {'receivers_id':{
                                        $elemMatch:{$eq:1}}}], 'messages.sender':{$ne:1}}}, 
                 {$unwind:"$messages"}, 
                 {$unwind:"$messages.read_by"}
])

获得结果后,您可以相应地进行分组和求和。 (不幸的是,您的示例并未显示检测到未读取的内容,并且只有1条消息)

话虽如此,您需要重新考虑data models。将消息存储在嵌入式文档中,一旦您收到许多消息,就可以到达BSON document size limit of 16MB。您当前的型号可能适合小型聊天,但它不会很好地扩展。有关详细信息,请参阅Data Model Examples and Patterns