PHP Mongo Aggregation only returns _id


PHP Mongo Aggregation only returns _id

我试图返回由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将用于指定返回字段,即使如此,我也没有得到我指定的字段。

任何帮助都非常感谢

为了获得线程中的所有消息,您基本上需要 $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'
                )
            )
        )
    )
);

这样就把所有相关的消息放入与该键绑定的"messages"数组中。

作为旁注,虽然您可以这样做,但您也可以根据"in_reply_to"字段对结果进行排序,并以这种方式处理它们,寻找值中的变化以指示新线程。

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

如果你想在_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_userfrom_user的值在使用$last而不是$first的所有文档中相同,则$last将产生相同的结果。