Nous pouvons utiliser le cadre d'agrégation pour ce faire. Nous devons d'abord $sort
par user
et "_id". À partir de là, nous $group
par "utilisateur" et utilisez le $last
Opérateur d'accumulateur pour renvoyer le dernier document pour chaque utilisateur. Notez que nous pouvons également utiliser le $first
opérateur d'accumulation si nous trions nos documents par ordre décroissant, mais en triant par ordre croissant et en utilisant $last
clarifions notre intention.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
qui produit :
{
"_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"
}
}
Nous voudrons peut-être ajouter un $project
à notre pipeline, mais cela entraînera une baisse des performances. Cependant, cela réduira à la fois la quantité de données envoyées sur le réseau et le temps et la mémoire utilisés pour décoder les documents côté client si vous n'avez pas besoin de toutes les paires clé/valeur dans un document renvoyé.
Le $project
la scène ressemble à ceci :
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}