Indien mogelijk, raad ik u aan om de waarde waarop u wilt sorteren altijd (dubbel) op te slaan. Zet het in de array en in een tweede veld. Telkens wanneer u een nieuwe waarde naar de array pusht (of de array opslaat), voegt u een nieuw veld toe dat overeenkomt met de "laatste waarde in array" en indexeert en sorteert u daarop. In het onderstaande voorbeeld noemde ik het 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" : [ ] }
Maak een index:
db.so.ensureIndex({lastR: 1})
En gebruik dan:
> 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 }
Het zal veel veelzijdiger en uitbreidbaarder zijn dan proberen een aggregatie-oplossing te gebruiken (die een limiet van 16 MB heeft voor de resultatenset en het veel complexer maakt om complexe documenten op te halen wanneer een projectie moet worden afgehandeld).