MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So sortieren Sie eine Sammlung anhand des letzten Elements eines Arrays

Wenn möglich, würde ich vorschlagen, dass Sie den Wert, nach dem Sie sortieren möchten, immer (doppelt) speichern. Legen Sie es in das Array und in ein zweites Feld. Immer wenn Sie einen neuen Wert in das Array verschieben (oder das Array speichern), fügen Sie ein neues Feld hinzu, das dem "letzten Wert im Array" entspricht, und indexieren und sortieren Sie danach. Im Beispiel unten habe ich es lastR genannt :

{ "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" : [ ] }

Erstellen Sie einen Index:

db.so.ensureIndex({lastR: 1})

Und dann verwenden Sie:

> 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 }

Es wird weitaus vielseitiger und erweiterbar sein als der Versuch, eine Aggregationslösung zu verwenden (die eine 16-MB-Grenze für die Ergebnismenge hat und es viel komplexer macht, komplexe Dokumente abzurufen, wenn es um eine Projektion geht).