【发布时间】:2013-10-04 22:40:06
【问题描述】:
我有一个包含以下字段的消息集合:_id、senderId、receiverId、dateSubmittedMs、message,对于给定的用户,我想向他返回来自所有人的最新消息其他用户。因此,例如,如果有用户 Alex、Barb、Chuck、Dora,我想返回 Alex 与 Barb、Chuck 和 Dora 之间的最新消息。做这个的最好方式是什么?我可以使用聚合一步完成吗?
官方在线文档 (http://docs.mongodb.org/manual/reference/aggregation/min/) 中的聚合示例展示了如何在集合中找到各组的最低年龄,但我需要的是类似于在各组中找到最年轻的人的名字。
这是我目前的做法:
第 1 步:在 Alex 发送和接收的所有消息中找出 dateSubmitted 的最高值,并将其他用户分组:
var M = Messages.aggregate(
{$match:
{$or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]}
},
{$group: {_id: "$receiverId", lastestSubmitted: {$max: "$submitted"} }}).fetch();
第 2 步:创建一个包含这些最高 dateSubmitted 值的数组:
var MIds = _.pluck(M,'lastestSubmitted');
第 3 步:按 senderId、receiverId 和 latestSubmitted 查找这些消息:
return Messages.find(
{submitted: {$in: MIds}, $or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]},
{$sort: {submitted: 1}}
});
这样做有两个问题:
- 可以一步完成而不是三步吗?也许通过 mapReduce 或 Aggregate 命令?
- 除了只对
receiverId: 'Alex'进行分组外,有没有办法对类似$or [{receiverId: 'Alex', senderId: 'Barb'}, {senderId: 'Alex', receiverId: 'Barb'}]的内容进行分组? (但对于其他每个用户)这将允许我在 Alex 与之交谈的任何两个参与者之间的对话中获得最新消息。比如:
有什么建议吗?
【问题讨论】: