Hvis det er muligt, vil jeg foreslå, at du altid (dobbelt) gemmer den værdi, du vil sortere efter. Sæt det i arrayet og i et andet felt. Når du skubber en ny værdi til arrayet (eller gemmer arrayet), skal du tilføje et nyt felt svarende til "sidste værdi i array" og derefter indeksere og sortere på det. I eksemplet nedenfor kaldte jeg det 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" : [ ] }
Opret et indeks:
db.so.ensureIndex({lastR: 1})
Og brug derefter:
> 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 }
Det vil være langt mere alsidigt og udvideligt end at forsøge at bruge en aggregeringsløsning (som vil have en grænse på 16 MB for resultatsættet og gør det langt mere komplekst at hente komplekse dokumenter, når man skal håndtere en projektion).