Welkom bij Stack overflow. Het is een fatsoenlijke vraag, je hebt gepost. Laat me alsjeblieft het voorrecht nemen om je te helpen op de manier die ik kan.
Dit is een aggregatieopdracht die in de mongo-shell kan worden uitgevoerd. Gelieve de uitleg inline te vinden.
db.collection.aggregate([
//match all those records which involve Wood.
{$match:{$or:[{"to":"wood"},{"from":"wood"}]}},
// sort all the messages by descending order
{$sort:{time:-1}},
{
// Now we need to group messages together, based on the to and from field.
// We generate a key - "last_message_between", with the value being a concatenation
// result of the values in to and from field.
// Now, Messages from Wood to billy and Billy to wood should be treated under a single group right.
// To achieve that, we do a small trick to make the result contain the name coming last
// alphabetically, first. So our key for all the Messages from Wood to Billy and Billy to Wood would be
// "Wood and Billy".
// And then we just display the first document that appears in the group, that would be the
// latest Message.
$group:{"_id":{
"last_message_between":{
$cond:[
{
$gt:[
{$substr:["$to",0,1]},
{$substr:["$from",0,1]}]
},
{$concat:["$to"," and ","$from"]},
{$concat:["$from"," and ","$to"]}
]
}
},"message":{$first:"$$ROOT"}
}
}
])
Je kunt het onderstaande uitvoeren op mangoest.
Collection.aggregate(
{$match:{$or:[{"to":"wood"},{"from":"wood"}]}},
{$sort:{time:-1}},
{
$group:{"_id":{
"last_message_between":{
$cond:[
{
$gt:[
{$substr:["$to",0,1]},
{$substr:["$from",0,1]}]
},
{$concat:["$to"," and ","$from"]},
{$concat:["$from"," and ","$to"]}
]
}
},"message":{$first:"$$ROOT"}
}
},
function(err, res)
{
if (err) return handleError(err);
console.log(res);
}
)