Om möjligt skulle jag föreslå att du alltid (dubbel) lagrar värdet du vill sortera efter. Lägg den i arrayen och i ett andra fält. När du trycker på ett nytt värde till arrayen (eller lagrar arrayen), lägg till ett nytt fält som motsvarar det "sista värdet i arrayen" och indexera och sortera sedan på det. I exemplet nedan kallade jag 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" : [ ] }
Skapa ett index:
db.so.ensureIndex({lastR: 1})
Och använd sedan:
> 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 kommer att vara mycket mer mångsidigt och expanderbart än att försöka använda en aggregeringslösning (som kommer att ha en gräns på 16 MB för resultatuppsättningen och gör det mycket mer komplicerat att hämta komplexa dokument när man behöver hantera en projektion).