我有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 文档大小限制。您当前的模型可能适合小型聊天,但它不会很好地扩展。有关详细信息,请参阅数据模型示例和模式。