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