MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb erhält die letzte Kombination im Aggregationsframework

Was Sie hier brauchen, ist ein „eindeutiger Schlüssel“-Wert, der für jede Kombination aus „Sender und Empfänger“ generiert wird. Wenn Sie dies regelmäßig tun möchten, würde ich vorschlagen, den Wert im Dokument zu speichern. Aber so können Sie das Problem mit dem Aggregations-Framework lösen:

 db.messages.aggregate([
    { "$project": {
       "combined": { "$map": {
           "input": { "$literal": ["A","B"] },
           "as": "bin",
           "in": { "$cond": [ 
               { "$eq": [ "$$bin", "A" ] },
               "$sender",
               "$recipient"
           ]}
       }},
       "doc": "$$ROOT"
    }},
    { "$unwind": "$combined" },
    { "$sort": { "_id": 1, "combined": 1, "doc.date": -1 } },
    { "$group": {
        "_id": "$_id",
        "combined": { "$push": "$combined" },
        "doc": { "$first": "$doc" }
    }},
    { "$group": {
        "_id": "$combined",
        "doc": { "$first": "$doc" }
    }}
])

Dadurch wird Ihr Beispiel auf die "eindeutigen" 3 Kombinationen für "Absender/Empfänger" eingegrenzt und das letzte Dokument in der Konversation zwischen diesem "Paar" zurückgegeben:

{
    "_id" : [
            "52f37fbaf9cd0e02773c97b1",
            "53172480f9cd0e682840b9f7"
    ],
    "doc" : {
            "_id" : "54b4cec9f6a48ce34f8b6429",
            "date" : NumberLong(1421135561),
            "sender" : "53172480f9cd0e682840b9f7",
            "recipient" : "52f37fbaf9cd0e02773c97b1",
            "isRead" : false,
            "text" : "Hello 2!"
    }
}
{
    "_id" : [
            "52f37fbaf9cd0e02773c97b1",
            "53072122f9cd0ee76306dc5a"
    ],
    "doc" : {
            "_id" : "54b4cf02f6a48ce54f8b62f9",
            "date" : NumberLong(1421135618),
            "sender" : "53072122f9cd0ee76306dc5a",
            "recipient" : "52f37fbaf9cd0e02773c97b1",
            "isRead" : false,
            "text" : "Hello 3!"
    }
}
{
    "_id" : [
            "52ea178ff9cd0e9f24d776b4",
            "52f37fbaf9cd0e02773c97b1"
    ],
    "doc" : {
            "_id" : "54b4d249f6a48ce54f8b6b9f",
            "date" : NumberLong(1421136457),
            "sender" : "52f37fbaf9cd0e02773c97b1",
            "recipient" : "52ea178ff9cd0e9f24d776b4",
            "isRead" : false,
            "text" : "Hello 4!"
    }
}