我有一个包含以下字段的消息集合:_id
、senderId
、receiverId
、dateSubmittedMs
、message
,对于给定的用户,我想将所有其他用户的最新消息返回给他。因此,例如,如果有用户 Alex、Barb、Chuck、Dora,我想返回 Alex 与 Barb、Chuck 和 Dora 之间的最新消息。做这个的最好方式是什么?我可以使用聚合一步完成吗?
官方在线文档(http://docs.mongodb.org/manual/reference/aggregation/min/)中的聚合示例显示了如何找到集合中各组的最低年龄,但我需要的是类似于 find一群人中最年轻的人的名字。
这是我目前的方法:
dateSubmitted
第 1 步:找出Alex 发送和接收的所有消息的最高值,对其他用户进行分组:
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 与之交谈的任何两个参与者之间的对话中获得最新消息。例如:
有什么建议么?