sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man sorterar en samling med det sista elementet i en array

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



  1. Hur kan jag i MongoDB sortera dokument baserat på en egenskap i ett inbäddat objekt?

  2. Letar efter en lösning mellan att ställa in många timers eller att använda en schemalagd uppgiftskö

  3. Java/MongoDB-fråga efter datum

  4. Använda löften i Mongoose Routes