Si possible, je vous suggérerais de toujours (doubler) stocker la valeur sur laquelle vous souhaitez trier. Mettez-le dans le tableau et dans un second champ. Chaque fois que vous poussez une nouvelle valeur dans le tableau (ou que vous stockez le tableau), ajoutez un nouveau champ correspondant à la "dernière valeur du tableau", puis indexez et triez dessus. Dans l'exemple ci-dessous, je l'ai appelé 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" : [ ] }
Créer un index :
db.so.ensureIndex({lastR: 1})
Et puis utilisez :
> 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 }
Ce sera beaucoup plus polyvalent et évolutif que d'essayer d'utiliser une solution d'agrégation (qui aura une limite de 16 Mo pour l'ensemble de résultats et rendra beaucoup plus complexe la récupération de documents complexes lorsqu'il est nécessaire de traiter une projection).