首页 > 解决方案 > Mongo:获取每个组的第一个具有匹配条件的文档

问题描述

我有带有日期、txt、发送者和接收者的消息模型。我需要获取两个用户之间的最后一条消息,例如:

{_id: 1, sender:1, receiver:2, txt: “hi 2”, date: “2018/04/01”}
{_id: 2, sender:1, receiver:2, txt: “how are you 2”, date: “2018/04/02”}
{_id: 3, sender:2, receiver:1, txt: “hi 1”, date: “2018/04/03”}
{_id: 4, sender:1, receiver:3, txt: “hi 3”, date: “2018/04/01”}
{_id: 5, sender:1, receiver:3, txt: “how are you 3”, date: “2018/04/02”}

如果我正在寻找涉及用户 1 的新消息,我需要:

{_id: 3, sender:2, receiver:1, txt: “hi 1”, date: “2018/04/03”}
{_id: 5, sender:1, receiver:3, txt: “how are you 3”, date: “2018/04/02”}

如果无法以用户可以是发送者或接收者的方式对它们进行分组,那么这也可以:

{_id: 2, sender:1, receiver:2, txt: “how are you 2”, date: “2018/04/02”}
{_id: 3, sender:2, receiver:1, txt: “hi 1”, date: “2018/04/03”}
{_id: 5, sender:1, receiver:3, txt: “how are you 3”, date: “2018/04/02”}

你们有什么感想?可以用 mongo/mongoose 做到这一点吗?我正在查看聚合和组,但我对它们不太熟悉。

标签: mongodbmongoose

解决方案


你可以这样做:

db.collectionName.aggregate([
    {
        $facet: {
            "sender": [
                {$match: {"sender" : 1}},
                {$sort: {_id: -1}},
                {$limit:1}
            ],
            "receiver": [
                {$match: {"receiver" : 1}},
                {$sort: {_id: -1}},
                {$limit:1}
            ]
        }
    },
    {
        $project: {
            sender: { $arrayElemAt: [ "$sender", 0 ] },
            receiver: { $arrayElemAt: [ "$receiver", 0 ] }
        }
    }
])

推荐阅读