W tym celu możemy użyć struktury agregacji. Najpierw musimy $sort
przez user
i „_id”. Następnie $group
przez „użytkownika” i użyj $last
operator akumulatora, aby zwrócić ostatni dokument dla każdego użytkownika. Pamiętaj, że możemy również użyć $first
operator akumulatora, jeśli sortujemy nasze dokumenty w kolejności malejącej, ale sortujemy w kolejności rosnącej i używamy $last
wyjaśnij naszą intencję.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
co daje:
{
"_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żemy chcieć dodać $project
do naszego potoku, ale spowoduje to spadek wydajności. Jednak zmniejszy to zarówno ilość danych przesyłanych przez sieć, jak i czas i pamięć używaną do dekodowania dokumentów po stronie klienta, jeśli nie są potrzebne wszystkie pary klucz/wartość w zwróconym dokumencie.
$project
scena wygląda tak:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}