Kita dapat menggunakan kerangka kerja agregasi untuk melakukan ini. Pertama, kita perlu $sort
oleh user
dan "_id". Dari sana, kami kemudian $group
oleh "pengguna" dan gunakan $last
operator akumulator untuk mengembalikan dokumen terakhir untuk setiap pengguna. Perhatikan bahwa kita juga dapat menggunakan $first
operator akumulator jika kita mengurutkan dokumen dalam urutan menurun, tetapi mengurutkan dalam urutan menaik dan menggunakan $last
memperjelas niat kita.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
yang menghasilkan:
{
"_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"
}
}
Kami mungkin ingin menambahkan $project
ke saluran kami tetapi hal itu akan menyebabkan penurunan kinerja. Namun ini akan mengurangi jumlah data yang dikirim melalui kabel dan waktu serta memori yang digunakan untuk memecahkan kode dokumen di sisi klien jika tidak perlu semua pasangan kunci/nilai dalam dokumen dikembalikan.
$project
tampilan panggung seperti ini:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}