Mongodb сортировать по массиву - PullRequest
0 голосов
/ 05 декабря 2018

Есть ли способ сортировки по заданному массиву?

что-то вроде этого:

const somes = await SomeModel.find({}).sort({'_id': {'$in': [ObjectId('sdasdsd), ObjectId('sdasdsd), ObjectId('sdasdsd)]}}).exec()

То, что я ищу, - это способ получить решение, получить весь документсбор и сортировка, если _id документа совпадает с одним из заданного массива.

Пример:

у нас есть коллекция альбомов и коллекция песен.В коллекции альбомов мы храним идентификаторы песен, которые принадлежат альбомам.

Я хочу получить песни, но если песня находится в альбоме, возьмите их перед массивом.

Я решил это следующим образом, но выглядит немного странно:

const songs = await SongMode.find({}).skipe(limit * page).limit(limit).exec();
const album = await AlbumModel.findById(id).exec();

if(album) {
    songArr = album.songs.slice(limit * page);

    for(let song of album.songs) {
        songs.unshift(song);
        songs.pop();
    }
}

1 Ответ

0 голосов
/ 06 декабря 2018

Этого нельзя достичь, используя обычный .find().sort().Вместо этого вам нужно будет использовать конвейер агрегации MongoDB (.aggregate()).В частности, вам нужно будет сделать следующее:

  1. Выполнить ион $project так, что если _id равен $in массиву, вашему новому sort_field будет присвоено значение 1, в противном случае ему присваивается значение 0.
  2. Выполните $sort так, чтобы вы выполняли сортировку по убыванию с новым sort_field.

Если выЕсли вы используете MongoDB версии 3.4 или выше, то это легко из-за оператора $addFields:

const your_array_of_ids = [
    ObjectId('objectid1'),
    ObjectId('objectid2'),
    ObjectId('objectid3')
];

SomeModel.aggregate([
    { '$addFields': {
        'sort_field': { '$cond': {
            'if': { '$in': [ '$_id', your_array_of_ids ] },
            'then': 1,
            'else': 0
        }}
    }},
    { '$sort': {
        'sort_field': -1
    }}
]);

Если вы используете более старую версию MongoDB, то решение аналогичное, но вместо$addFields вы будете использовать $project.Кроме того, вам нужно будет явно включить все остальные поля, которые вы хотите включить, в противном случае они будут исключены из результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...