Jika memungkinkan, saya sarankan Anda selalu (menggandakan) menyimpan nilai yang ingin Anda urutkan. Masukkan ke dalam array dan di bidang kedua. Setiap kali Anda mendorong nilai baru ke array (atau menyimpan array), tambahkan bidang baru yang sesuai dengan "nilai terakhir dalam array" dan kemudian indeks dan urutkan itu. Pada contoh di bawah, saya menyebutnya lastR
:
{ "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR": 3 }
{ "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR": 1 }
{ "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR": 10 }
{ "value" : -3, "r" : [ ] }
Buat indeks:
db.so.ensureIndex({lastR: 1})
Dan kemudian gunakan:
> db.so.find().sort({lastR: 1})
{ "_id" : ObjectId("5203a1c83c5438af60de63a1"), "value" : -3, "r" : [ ] }
{ "_id" : ObjectId("5203a1ad3c5438af60de639f"), "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR" : 1 }
{ "_id" : ObjectId("5203a1d33c5438af60de63a2"), "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR" : 3 }
{ "_id" : ObjectId("5203a1b73c5438af60de63a0"), "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR" : 10 }
Ini akan jauh lebih fleksibel dan dapat diperluas daripada mencoba menggunakan solusi agregasi (yang akan memiliki batas 16 MB untuk kumpulan hasil dan membuatnya jauh lebih kompleks untuk mengambil dokumen kompleks saat perlu menangani proyeksi).