Vítejte v Stack overflow. To je slušná otázka, napsal jsi. Prosím, dovolte mi, abych vám pomohl, jak mohu.
Toto je agregační příkaz, který lze spustit v mongo shellu. Vysvětlení najdete v textu.
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"}
}
}
])
Níže můžete spustit na mongoose.
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);
}
)