K tomu můžeme použít agregační rámec. Nejprve musíme $sort
od user
a "_id". Odtud pak $group
uživatelem a použijte $last
provozovatel akumulátoru vrátit poslední doklad pro každého uživatele. Všimněte si, že můžeme také použít $first
operátor akumulátoru, pokud naše dokumenty řadíme sestupně, ale třídíme vzestupně a pomocí $last
vyjasnit náš záměr.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
který produkuje:
{
"_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"
}
}
Možná budeme chtít přidat $project
do našeho potrubí, ale způsobí to pokles výkonu. Sníží se však jak množství dat zasílaných po drátě, tak čas a paměť použitá k dekódování dokumentů na straně klienta, pokud nepotřebujete vrátit všechny páry klíč/hodnota v dokumentu.
$project
fáze vypadá takto:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}