Можем да използваме рамката за агрегиране, за да направим това. Първо трябва да $sort
от user
и "_id". Оттам след това $group
от "потребител" и използвайте $last
акумулаторен оператор за връщане на последния документ за всеки потребител. Обърнете внимание, че можем също да използваме $first
оператор на акумулатор, ако сортираме документите си в низходящ ред, но сортираме във възходящ ред и използваме $last
изясним намерението си.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
което произвежда:
{
"_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"
}
}
Може да искаме да добавим $project
към нашия тръбопровод, но това ще доведе до спад в производителността. Това обаче ще намали както количеството данни, изпратени по кабела, така и времето и паметта, използвани за декодиране на документи от страна на клиента, ако не са необходими всички двойки ключ/стойност във върнат документ.
$project
сцена изглежда така:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}