sql >> Databasteknik >  >> NoSQL >> MongoDB

hur man sorterar array av objekt efter godtycklig lista i mongo

Du kan prova att köra en anpassad komparatorfunktion med den inbyggda JavaScript-koden sort() metod på arrayen som returneras från cursor.toArray() metod:

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

Exempelutdata

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

Med den nya MongoDB 3.4-versionen bör du kunna utnyttja användningen av de inbyggda MongoDB-operatörerna $addFields och $indexOfArray i aggregeringsramverket.

  • $addFields pipeline-steget låter dig $ projekt nya fält till befintliga dokument utan att känna till alla andra befintliga fält.
  • $indexOfArray expression returnerar positionen för ett visst element i en given array.

Så för att sammanfatta det kan du prova följande sammanlagda operation (med MongoDB 3.4):

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



  1. Vad är skillnaden mellan HSET och HMSET-metoden i redis-databasen

  2. Django+MongoDB vs Node.js+MongoDB

  3. Att lägga upp JSON till Flask resulterar i 400 Bad Request-fel

  4. mongodb replicaset new member visar inte korrekt diskanvändning på EC2