我试图从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
}
})