MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So sortieren Sie ein Array von Objekten nach einer beliebigen Liste in Mongo

Sie könnten versuchen, eine benutzerdefinierte Komparatorfunktion mit dem nativen JavaScript sortieren() -Methode auf dem Array, das von 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);

Beispielausgabe

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

Mit der neuen MongoDB-Version 3.4 sollten Sie in der Lage sein, die nativen MongoDB-Operatoren $addFields und $indexOfArray im Aggregationsframework.

  • Die $addFields Pipeline-Schritt ermöglicht Ihnen $ Projekt neue Felder in vorhandene Dokumente einfügen, ohne alle anderen vorhandenen Felder zu kennen.
  • Der $indexOfArray Ausdruck gibt die Position eines bestimmten Elements in einem gegebenen Array zurück.

Zusammenfassend könnten Sie also die folgende aggregierte Operation (mit MongoDB 3.4) ausprobieren:

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