Ada beberapa hal yang perlu dipahami di sini.
Saat Anda menggunakan $group
batas-batas akan diurutkan sesuai urutan penemuannya tanpa tahap awal atau akhir $sort
operasi. Jadi jika dokumen Anda awalnya dalam urutan seperti ini:
{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
Kemudian cukup gunakan $group
tanpa $sort
pada akhirnya pada pipa akan mengembalikan Anda hasil seperti ini:
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
Itu adalah satu konsep, tetapi sepertinya apa yang Anda harapkan dalam hasil memerlukan pengembalian "bidang lain terakhir" dengan urutan uid
yang diurutkan adalah apa yang Anda cari. Dalam hal ini cara untuk mendapatkan hasil Anda sebenarnya adalah $sort
pertama dan kemudian gunakan $last
operator:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"created": { "$last": "$created" },
"another_col": { "$last": "$created" }
}}
])
Atau pada dasarnya terapkan pengurutan sesuai keinginan Anda.
Perbedaan antara $last
dan $max
adalah bahwa yang terakhir akan memilih nilai "tertinggi" untuk bidang yang diberikan dalam pengelompokan _id
, terlepas dari saat ini diurutkan pada urutan yang tidak diurutkan. Di sisi lain, $last
akan memilih nilai yang muncul pada "baris" yang sama dengan pengelompokan "terakhir" _id
nilai.
Jika Anda benar-benar ingin mengurutkan nilai array maka pendekatannya serupa. Menjaga anggota array dalam urutan "dibuat" Anda juga akan mengurutkan terlebih dahulu:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"row": {
"$push": {
"created": "$created",
"another_col": "$another_col"
}
}
}}
])
Dan dokumen dengan bidang tersebut akan ditambahkan ke larik dengan urutan yang sudah diurutkan.