sql >> Database >  >> NoSQL >> MongoDB

hoe een reeks objecten te sorteren op willekeurige lijst in mongo

U kunt proberen een aangepaste vergelijkingsfunctie uit te voeren met de native JavaScript sort() methode op de array geretourneerd door de cursor.toArray() methode:

var order = ["food", "coffee", "grocery"];
var docs = db.collection.find().toArray().sort(function(a, b) { 
    return order.indexOf(a.category) - order.indexOf(b.category);
});
printjson(docs);

Voorbeelduitvoer

[
    {
        "_id" : "4JW7miNITl",
        "category" : "food"
    },
    {
        "_id" : "4Je4kmrrbZ",
        "category" : "coffee"
    },
    {
        "_id" : "4JgAh3N86x",
        "category" : "coffee"
    },
    {
        "_id" : "4JEEuhNIae",
        "category" : "grocery"
    }
]

Met de nieuwe MongoDB 3.4-versie zou u gebruik moeten kunnen maken van de native MongoDB-operators $addFields en $indexOfArray in het aggregatieraamwerk.

  • De $addFields pijplijnstap stelt u in staat om $project nieuwe velden toe aan bestaande documenten zonder alle andere bestaande velden te kennen.
  • De $indexOfArray expressie retourneert de positie van een bepaald element in een gegeven array.

Dus als je dat bij elkaar optelt, kun je de volgende aggregatiebewerking proberen (met MongoDB 3.4):

var order = ["food", "coffee", "grocery"],
    projection = { 
        "$addFields" : { 
            "__order" : { "$indexOfArray" : [ order, "$category" ] } 
        } 
    },
    sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);



  1. MongoDB geneste dieptelimiet objectveld

  2. MongoDB $setDifference

  3. Naamruimten in Redis?

  4. MongoDB $ lookup-pijplijnovereenkomst door _id werkt niet