我有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]
]
]);
首先这个查询应该显示一些结果,但我收到空值
答案 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。