我在那里我存储的信息的集合,它看起来像这样:如何在使用MongoDB聚合框架的组中找到最近的项目?
id sender receiver date
------------------------
1 1 2 30-May-15 3:14:48 PM
2 2 1 30-May-15 3:16:28 PM
3 1 3 30-May-15 3:20:00 PM
4 1 2 30-May-15 3:21:48 PM
5 3 2 30-May-15 3:25:15 PM
6 4 1 30-May-15 3:30:05 PM
发件人包含谁发送的消息和接收器包含谁将会收到它的人的ID的人的ID。
我想创建一个最近的联系人列表。也就是说,找到某个人说过的所有人(作为发件人或收件人),按日期排序。如果重复,我只需要保留最近的联系人。
例如:如果我搜索与ID = 1的人交谈的人,我想获得以下人员ID:4,2,3(与他讲话的人):4是最新的人(日期为30日至5月15日3点30分5秒),2日为4日(日期为15日至15日3点21分48秒),3日为2日(日期为15日至15日3点20分下午)。
我尝试此查询:
messages.aggregate({$match: {$or:[{sender: searched_id}, {receiver: searched_id}]}},
{$sort: {date: -1}},
{$group: {"_id": {sender: "$sender", receiver: "$receiver"}}},
function(err, docs){
console.log(JSON.stringify(docs));
});
该查询给了我所有谁某某人所讲的人,但它不是以正确的顺序,如果我更改排列顺序,它给我的确切的结果。
我该如何按日期对我的收藏进行分类?
我不明白为什么你需要的* $组*参数。你的$匹配和$排序工作得很好。 –
@ThomasBormans,因为我只需要有一次id,所以我认为按2个字段分组将会产生不同的id。我试图删除$ group参数,它给了我一些我甚至没有收集到的id。 –
_“它给了我一些我甚至没有收集到的id”_没有办法让'$ match'或'$ sort'来“生成”新的id - 也不会产生重复的id。 '$ match'将一个输入文档映射到零或一个输出文档。 '$ sort'将一个输入文档映射到一个输出文档。无论如何,它们都不会改变文件。 –