Сортировка результатов запроса по порядку элементов в предоставленном массиве условий в Mongoose

Я ищу способ запросить базу данных с помощью Mongoose на основе массива идентификаторов документов и вернуть результаты в том порядке, в котором они были представлены Mongoose в этом массиве.

Например, если я снабдил Mongoose этим массивом ["112", "111", "113"] и если предположить, что все документы с этими идентификаторами существуют, результатом будет массив документов, упорядоченных соответственно как: [{//112},{//111},{//113}]

Чтобы быть предельно ясным, мне не нужно сортировать массив по какому-либо конкретному полю документа - я ищу способ указать Mongoose сортировку по порядку идентификаторов, представленному в самом массиве условий. Это возможно?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая следующие данные:

db.col.save({ a: "111"})
db.col.save({ a: "112"})
db.col.save({ a: "113"})
db.col.save({ a: "114"})

вы можете использовать $ матч Aggregation Framework для фильтрации всех элементов, которых нет в указанном массиве, и $ addFields с $ indexOfArray для получения свойства index. Затем вы можете $ sort этим свойством и использовать $ проект для удаления временного поля. Пытаться:

db.col.aggregate([
    {
        $match: { a: { $in: ["112", "111", "113"] } }
    },
    {
        $addFields: {
            index: { $indexOfArray: [ ["112", "111", "113"], "$a" ] }
        }
    },
    {
        $sort: { index: 1 }
    },
    {
        $project: { index: 0, _id: 0 }
    }
])

Выходы:

{ "a" : "112" }
{ "a" : "111" }
{ "a" : "113" }

Спасибо за элегантное решение. Я читал, что агрегат - это самый медленный метод запросов в MongoDB, но для моего конкретного случая использования это было идеальное решение.

Nadav 17.12.2018 11:41

Другие вопросы по теме