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

hvordan man sorterer array af objekter efter vilkårlig liste i mongo

Du kan prøve at køre en brugerdefineret komparatorfunktion med det oprindelige JavaScript sort() metode på arrayet returneret fra cursor.toArray() metode:

var order =["mad", "kaffe", "købmand"];var docs =db.collection.find().toArray().sort(function(a, b) { returordre. indexOf(a.category) - order.indexOf(b.category);});printjson(docs); 

Eksempeloutput

[ { "_id" :"4JW7miNITl", "category" :"mad" }, { "_id" :"4Je4kmrrbZ", "category" :"kaffe" }, { "_id" :"4JgAh3N86x ", "category" :"kaffe" }, { "_id" :"4JEEuhNIae", "category" :"købmand" }]

Med den nye MongoDB 3.4-version burde du kunne udnytte brugen af ​​de oprindelige MongoDB-operatører $addFields og $indexOfArray i aggregeringsrammen.

  • $addFields pipeline-trin giver dig mulighed for at $ projekt nye felter til eksisterende dokumenter uden at kende alle de andre eksisterende felter.
  • $indexOfArray udtryk returnerer et bestemt elements position i en given matrix.

Så for at sætte det sammen, kan du prøve følgende samlede operation (med MongoDB 3.4):

var order =["mad", "kaffe", "købmand"], projection ={ "$addFields" :{ "__order" :{ "$indexOfArray" :[ ordre, "$category" ] } } }, sort ={ "$sort" :{ "__order" :1 } };db.collection.aggregate([ projektion, sort]); 



  1. Hvordan fjerner man objekt under hensyntagen til referencer i Mongoose Node.js?

  2. hvordan man korrekt kaster ObjectId i mongoose

  3. Hvordan kan jeg ophæve flere objekter med MongoDB &Node.js?

  4. Er det OK at forespørge en MongoDB flere gange pr. anmodning?