PHP Mongo Aggregation仅返回_id

时间:2014-06-17 14:26:05

标签: php mongodb mongodb-query aggregation-framework

我正在尝试返回按in_reply_to字段分组的邮件集合,我有以下代码:

$result = $this->db->Message->aggregate(
            array(
                array(
                    '$project' => array('message' => 1, 'in_reply_to'=> 1, 'to_user' => 1, 'from_user' => 1)
                ),
                array(
                    '$group' => array('_id' => '$in_reply_to'),
                ),
            )
        );
        print_r($result);exit;

结果是:

Array ( 
    [result] => Array ( 
        [0] => Array ( 
            [_id] => MongoId Object ( 
                [$id] => 53a03d43b3f7e236470041a8 
            ) 
        ) 
        [1] => Array ( 
            [_id] => MongoId Object ( 
                [$id] => 53a03cbdb3f7e2e8350041bb
            ) 
        ) 
   ) 
   [ok] => 1 
)

理想情况下,我喜欢整个Message对象,但我确实认为$ project将用于指定返回字段,即便如此,我也没有得到我指定的字段。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

为了获得线程中的所有消息,您基本上想要$push

$result = $this->db->Message->aggregate(
    array(
        array(
            '$group' => array(
                '_id' => '$in_reply_to',
                'messages' => array(
                    '$push' => array(
                        '_id' => '$_id',
                        'message' => '$message',
                        'to_user' => '$to_user',
                        'from_user' =>'$from_user'
                    )
                )
            )
        )
    )
);

MongoDB 2.6你有$$ROOT变量缩短了这个:

$result = $this->db->Message->aggregate(
    array(
        array(
            '$group' => array(
                '_id' => '$in_reply_to',
                'messages' => array(
                    '$push' => '$$ROOT'
                )
            )
        )
    )
);

因此,将所有相关消息放入"消息"数组与该键相关联。

正如旁注,虽然你可以做到这一点,你也可以通过你的" in_reply_to"来对结果进行排序。字段并处理它们以寻找值的变化来指示新线程。

使用find进行排序将是最快的处理方式,即使它不方便地将所有内容放在一个键下。

答案 1 :(得分:0)

如果您想在_id字段旁边获取其他字段,则在使用$ group运算符时,您需要使用一些可用的累加器(如$ first或$ last)来包含它们。您可以在MongoDB $group文档页面上看到完整列表。

查询将如下所示:

$result = $this->db->Message->aggregate(
    array(
        array(
            '$project' => array(
                'message' => 1, 
                'in_reply_to'=> 1, 
                'to_user' => 1, 
                'from_user' => 1
            )
        ),
        array(
            '$group' => array(
                '_id' => '$in_reply_to',
                'message' => array('$first' => '$message'),
                'to_user' => ('$first' => '$to_user'),
                'from_user' => ('$first' => '$from_user')
            ),
        ),
    )
);

如果使用message代替to_user from_user的所有文档中$last$first$last值相同,则会生成相同的值结果