Vi kan bruge aggregeringsrammen til at gøre dette. Først skal vi $sort
af user
og "_id". Derfra $group
af "bruger" og brug $last
akkumulatoroperatør for at returnere det sidste dokument for hver bruger. Bemærk, at vi også kan bruge $first
akkumulatoroperator, hvis vi sorterer vores dokumenter i faldende rækkefølge, men sorterer i stigende rækkefølge og bruger $last
gøre vores hensigt klar.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
som producerer:
{
"_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"
}
}
Vi ønsker måske at tilføje et $project
til vores pipeline, men at gøre det vil medføre et fald i ydeevnen. Det vil dog reducere både mængden af data, der sendes over ledningen, og den tid og hukommelse, der bruges til at afkode dokumenter på klientsiden, hvis ikke alle nøgle/værdi-parrene i et dokument skal returneres.
$project
scenen ser sådan ud:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}