2016-11-01 4 views
1

Я искал способ сортировки массива объекта по произвольному списку. Предположим, что у меня есть этот массив объектов.как отсортировать массив объектов по произвольному списку в mongo

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

Это массив, который я бы хотел использовать в качестве критериев сортировки. Записи с food должны наступить первыми, затем coffee и grocery.

['food','coffee','grocery'] 

Результат должен быть:

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

Как я могу сделать этот тип сортировки по MongoDB с помощью мангуста? Я действительно не хочу делать какие-либо операции над кодом после извлечения данных.

+1

Ваш код это поле списка в документе? Или это список документов? – sergiuz

+0

@SergiuZaharie это список документов –

ответ

2

Вы можете попробовать запустить пользовательскую функцию компаратора с родной 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]); 
+0

Кажется, я не могу напрямую написать пользовательскую функцию сортировки для mongoose, https://github.com/Automattic/mongoose/issues/798 Мне нужно использовать '' 'db.eval' '' хорошо спасибо –

Смежные вопросы