MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

как да сортирате масив от обекти по произволен списък в mongo

Можете да опитате да стартирате персонализирана функция за сравнение с родния JavaScript sort() метод в масива, върнат от cursor.toArray() метод:

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

Примерен резултат

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

С новата версия на MongoDB 3.4 трябва да можете да използвате използването на собствените оператори на MongoDB $addFields и $indexOfArray в рамката за агрегиране.

  • $addFields стъпката на тръбопровода ви позволява да $project нови полета към съществуващи документи, без да знаете всички други съществуващи полета.
  • $indexOfArray израз връща позицията на определен елемент в даден масив.

Като съберем всичко това, можете да опитате следната агрегатна операция (с MongoDB 3.4):

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да върна броя на актуализираните обекти в mongodb?

  2. Как да изтриете MongoDB документи чрез импортиране на файл

  3. NodeJS Mongo - Mongoose - Име на динамична колекция

  4. Настройка на Play 2.0 FakeApplication с тестова конфигурация

  5. Защо Mongo прави заявка за нулеви филтри във FETCH след изпълнение на IXSCAN