sql >> Database >  >> NoSQL >> MongoDB

Een verzameling sorteren met het laatste element van een array

Indien mogelijk, raad ik u aan om de waarde waarop u wilt sorteren altijd (dubbel) op te slaan. Zet het in de array en in een tweede veld. Telkens wanneer u een nieuwe waarde naar de array pusht (of de array opslaat), voegt u een nieuw veld toe dat overeenkomt met de "laatste waarde in array" en indexeert en sorteert u daarop. In het onderstaande voorbeeld noemde ik het 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" : [ ] }

Maak een index:

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

En gebruik dan:

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

Het zal veel veelzijdiger en uitbreidbaarder zijn dan proberen een aggregatie-oplossing te gebruiken (die een limiet van 16 MB heeft voor de resultatenset en het veel complexer maakt om complexe documenten op te halen wanneer een projectie moet worden afgehandeld).



  1. Kan geen verbinding maken met een Mongodb-pod in Kubernetes (verbinding geweigerd)

  2. Bash-shellscript krijgt geen verbinding met MongoDB, zelfs als de status actief is

  3. hdel binnen hget block nodejs redis

  4. Krijg gesorteerde verschillende waarden met MongoTemplate