我正在尝试返回按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将用于指定返回字段,即便如此,我也没有得到我指定的字段。
非常感谢任何帮助
答案 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
值相同,则会生成相同的值结果