我有以下文档结构:
"messages": {
"_id" : ObjectId("515a4de9c1a3c09c19000001"),
"author" : "50fd0d38c1a3c04c27000000",recipient" : "5159a292c1a3c01d5b000005",
"conversation" : [
{
"author" : "50fd0d38c1a3c04c27000000",
"date" : ISODate("2013-04-02T03:18:01.204Z"),
"message" : "hello test",
"read" : false
},
{
"message" : "reply test",
"date" : ISODate("2013-04-02T03:36:57.444Z"),
"author" : "5159a292c1a3c01d5b000005",
"read" : true
}....
是否有可能获得会话消息的总数,其中conversation.read为false且未读消息的作者(conversation.author)不是启动会话的人?
我目前正在查找将conversation.read视为false的文档,然后在PHP中循环遍历它们以检查conversations.author字段。这有效,但我担心当我收到大量数据时会慢下来。
我正在使用PHP MongoDB驱动程序。
我试过了..
$unread_conversations = $db->messages->find(
array(
'conversation.read'=>false
'conversation.author'=>array('$ne'=>$_SESSION['account']['_id']->__toString())
));
但那不起作用,因为我想要的是不读取的消息,而不是作者。
答案 0 :(得分:0)
常规mongo查询无法做到这一点。您必须使用aggregation framework中内置的map-reduce或mongos。
要使用当前架构实现目标,您必须首先展开嵌套列表。
其他解决方案是更改架构并将每个会话存储为单独的文档(父文件包含父对话的ID)。
就像旁注:不要将id字段存储为字符串,总是使用ObjectId来存储mongo id。