我试图返回由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_user
和from_user
的值在使用$last
而不是$first
的所有文档中相同,则$last
将产生相同的结果。