sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan sorteres en samling ved hjælp af det sidste element i et array

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).



  1. Unik begrænsning med to felter i MongoDB

  2. Redis jokertegn slette script ved hjælp af EVAL, SCAN og DEL returnerer skrivekommandoer ikke tilladt efter ikke-deterministiske kommandoer

  3. I MongoDB, hvis et indeks er på 3 felter, kan vi bruge det indeks, når vi forespørger på 2 felter? (jokertegn på 3. felt)

  4. Hvordan får jeg en Date til at gemme som en Date i MongoDB i stedet for en Int64?