Possiamo usare il framework di aggregazione per farlo. Per prima cosa dobbiamo $sort
per user
e "_id". Da lì, $group
per "utente" e utilizzare $last
operatore accumulatore per restituire l'ultimo documento per ogni utente. Tieni presente che possiamo anche utilizzare $first
operatore accumulatore se ordiniamo i nostri documenti in ordine decrescente, ma in ordine crescente e utilizzando $last
chiarire la nostra intenzione.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
che produce:
{
"_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"
}
}
Potremmo voler aggiungere un $project
alla nostra pipeline, ma ciò causerà un calo delle prestazioni. Tuttavia ridurrà sia la quantità di dati inviati via cavo che il tempo e la memoria utilizzati per decodificare i documenti sul lato client se non è necessario restituire tutte le coppie chiave/valore in un documento.
Il $project
fase assomiglia a questo:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}