Hiervoor kunnen we het aggregatieraamwerk gebruiken. Eerst moeten we $sort
door user
en "_id". Van daaruit gaan we dan $group
door "gebruiker" en gebruik de $last
accumulator-operator om het laatste document voor elke gebruiker te retourneren. Merk op dat we ook de $first
kunnen gebruiken
accumulator-operator als we onze documenten in aflopende volgorde sorteren, maar in oplopende volgorde sorteren en $last
gebruiken onze bedoeling duidelijk maken.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
die produceert:
{
"_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"
}
}
Mogelijk willen we een $project
toevoegen
aan onze pijplijn, maar dit zal leiden tot een daling van de prestaties. Het vermindert echter zowel de hoeveelheid gegevens die over de draad worden verzonden als de tijd en het geheugen die worden gebruikt om documenten aan de clientzijde te decoderen als niet alle sleutel/waarde-paren in een document moeten worden geretourneerd.
Het $project
podium ziet er als volgt uit:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}