php mongodb count嵌套属性

时间:2013-04-02 04:26:52

标签: php mongodb

我有以下文档结构:

"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())
    ));

但那不起作用,因为我想要的是不读取的消息,而不是作者。

1 个答案:

答案 0 :(得分:0)

常规mongo查询无法做到这一点。您必须使用aggregation framework中内置的map-reduce或mongos。

要使用当前架构实现目标,您必须首先展开嵌套列表。

其他解决方案是更改架构并将每个会话存储为单独的文档(父文件包含父对话的ID)。

就像旁注:不要将id字段存储为字符串,总是使用ObjectId来存储mongo id。