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

Wie kann nur das erste Vorkommen einer ID mit Mongoose zurückgegeben werden?

Dazu können wir das Aggregation Framework verwenden. Zuerst müssen wir $sort von user und "_id". Von dort haben wir dann $group durch „Benutzer“ und verwenden Sie den $last Akkumulator-Operator, um das letzte Dokument für jeden Benutzer zurückzugeben. Beachten Sie, dass wir auch $first verwenden können Akkumulator-Operator, wenn wir unsere Dokumente in absteigender Reihenfolge sortieren, aber in aufsteigender Reihenfolge sortieren und $last verwenden machen unsere Absicht klar.

db.collection.aggregate([
    { "$sort": { "user": 1, "_id": -1 } }, 
    { "$group": { 
        "_id": "$user", 
        "user": { "$last": "$$ROOT" } 
    }} 
])

was produziert:

{
    "_id" : "fje93jrg4",
    "user" : {
        "_id" : 2,
        "user" : "fje93jrg4",
        "event" : null,
        "group" : null,
        "name" : "Bob",
        "text" : "Testing"
    }
}
{
    "_id" : "94fg844f",
    "user" : {
        "_id" : 1,
        "user" : "94fg844f",
        "event" : null,
        "group" : null,
        "name" : "Jake",
        "text" : "Hello world"
    }
}
{
    "_id" : null,
    "user" : {
        "_id" : 4,
        "user" : null,
        "event" : "d0j3n9fn3",
        "group" : null,
        "name" : "My Event",
        "text" : "Testing 2"
    }
}

Möglicherweise möchten wir ein $project hinzufügen zu unserer Pipeline, aber dies führt zu einem Leistungsabfall. Es reduziert jedoch sowohl die Menge der über die Leitung gesendeten Daten als auch die Zeit und den Speicherplatz, die zum Decodieren von Dokumenten auf der Clientseite verwendet werden, wenn nicht alle Schlüssel/Wert-Paare in einem zurückgegebenen Dokument benötigt werden.

Das $project Bühne sieht so aus:

{ "$project": {
    "_id": "$user._id",
    "user": "$user.user",
    "event": "$user.event",
    "group": "$user.group",
    "name": "$user.name",
    "text": "$user.text"
}}