聚合框架 - 如何在 mongodb 中获取具有条件的多维数组计数



我有mongo文档聊天消息作为

{
    "_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]
        ]
    ]);

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

作为$or运算符的手册,您不需要conditions。例如在 mongo shell 中:

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

可以使用$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 条消息)

话虽如此,您需要重新考虑您的数据模型。将消息存储在嵌入式文档中,一旦您有许多消息,可能会达到 16MB 的 BSON 文档大小限制。您当前的模型可能适合小型聊天,但它不会很好地扩展。有关详细信息,请参阅数据模型示例和模式。

相关内容

  • 没有找到相关文章

最新更新