sql >> Databasteknik >  >> NoSQL >> MongoDB

Lista det sista meddelandet i varje konversation, som involverar en användare, i MongoDB

Välkommen till Stack overflow. Det är en anständig fråga, du skrev. Låt mig ta förmånen att hjälpa dig på det sätt jag kan.

Detta är ett aggregeringskommando som kan köras i mongo-skalet. Vänligen hitta förklaringen inline.

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"}
    }
}
])

Du kan köra nedanstående på 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);
}
)



  1. Så här gör du:Inkludera tredjepartsbibliotek i ditt MapReduce-jobb

  2. Hur får man array från mongoDB-samlingen?

  3. mongodb php - hur man gör INNER JOIN-liknande fråga

  4. Node.js - Skapa relationer med Mongoose