我试图从monogo数据库订购结果,这在mysql中是等效的。

SELECT * FROM `test` WHERE user1 = 'josieboy' or user2='josieboy' GROUP by user1, user2


这是我的mongoDB查询:

var query = Chat.aggregate(
    {
        $match:{
            $or:[
                {'user1':data},
                {'user2':data}
            ]
        }
    },
    {
        $group : {
            _id: '$user1',
            receiver : { $first: '$user1' },
            sender : { $first: 'user2' }
        }
    },
    {
        $project : {"_id":0, "user1":1, "user2":1}
    }
);


查询返回的结果超出预期:

返回结果

id user1 user2消息

1弗雷德·乔西博伊
2 josieboy fred Wts up
3气管josieboy HI

预期结果

id user1 user2消息

2 josieboy弗雷德
3气管josieboy HIy

我想返回Fred和Josieboy的一个匹配项,而不管返回的行数是多少,谁是最新ID和最新消息的user1或user2顺序。

如果更新查询可以在mongodb中,我也将很高兴...

谢谢

最佳答案

它长而丑陋,但我认为您想要做的是:

db.test.aggregate({
    $match: {
        $or: [{
            'user1': data
        }, {
            'user2': data
        }]
    }
}, {
    $project: {
        user1: 1,
        user2: 1,
        Message: 1,
        users: ["$user1", "$user2"]
    }
}, {
    $unwind: "$users"
}, {
    $redact: {
        $cond: {
            if: {
                $eq: ['$users', data]
            },
            then: '$$PRUNE',
            else: '$$KEEP'
        }
    }
}, {
    $group: {
        _id: '$users',
        __id: {
            $last: '$_id'
        },
        user1: {
            $last: '$user1'
        },
        user2: {
            $last: '$user2'
        },
        Message: {
            $last: '$Message'
        }
    }
}, {
    $project: {
        _id: '$__id',
        user1: 1,
        user2: 1,
        Message: 1
    }
})

08-08 02:18