Mongoose - невозможно заполнить сортировку по пути уведомления. из, потому что это подсвойство массива документов

У меня очень простая схема монго, к которой я обращаюсь с мангустом

Я могу сопоставить имя пользователя и имя с полем каждого уведомления из с помощью заполнения, проблема в том, что я не могу заставить какую-либо сортировку работать в поле даты

С этим кодом я получаю сообщение об ошибке

MongooseError: невозможно заполнить сортировку по пути, из-за уведомлений, потому что это подсвойство массива документов

Можно ли сделать это по-другому или по-новому (глубокое заполнение, виртуальные машины)? Я на Мангусте 5.

Я бы предпочел не использовать ванильный javascript для последующей сортировки объекта или создания отдельной схемы

var UserSchema = new Schema({  
    username: String,
    firstname: String,
    notifications: [
        {  
            from: { type: Schema.Types.ObjectId, ref: 'User'},
            date: Date,
            desc: String
        }
    ]
});

app.get('/notifications', function(req, res) {
    User.findOne({ _id: req._id }, 'notifications')
    .populate({
        path: 'notifications.from',   
        populate: {
            path: 'from',
            model: 'User',
            options: { sort: { 'notifications.date': -1 } }            
        }
    }) 
    .exec(function(err, user) {
        if (err) console.log(err)
    })
});

Этому возможному дубликату почти 2 года о Монго. Я спрашиваю, есть ли новые или другие способы сделать это в Mongoose, поскольку он немного изменился с 2016 года с новыми функциями.


person totalnoob    schedule 15.03.2018    source источник
comment
Возможный дубликат Как сортировать вложенные документы в поле массива?   -  person HRK44    schedule 15.03.2018
comment
Этому возможному дубликату почти 2 года о Монго. Я спрашиваю, есть ли новые или другие способы сделать это в Mongoose, поскольку он немного изменился с 2016 года с новыми функциями.   -  person totalnoob    schedule 15.03.2018


Ответы (1)


Из FAQ по Mongoose V5.0.12: http://mongoosejs.com/docs/faq.html#populate_sort_order

Вопрос. Я заполняю вложенное свойство в массиве, как показано ниже:

новая схема ({ arr: [{ child: { ref: 'OtherModel', type: Schema.Types.ObjectId } }] });

.populate({ path: 'arr.child', options: { sort: 'name' } }) не будет сортироваться по arr.child.name?

A. См. эту проблему GitHub. Это известная проблема, но исправить ее исключительно сложно.

Так что, к сожалению, пока это невозможно,

Один из способов добиться этого — просто использовать собственный sort javascript для сортировки уведомлений после выборки.

.exec(function(err, user) {
    if (err) console.log(err)

    user.notifications.sort(function(a, b){ 
        return new Date(b.date) - new Date(a.date);
    });

})
person Taki    schedule 30.03.2018
comment
не будет ли это проблемой, когда кто-то будет лениво загружать с разбиением на страницы? - person totalnoob; 09.04.2018
comment
нет, .sort() сортирует только результат, который вы получаете из базы данных, он делает то же самое, что и sort: { 'notifications.date': -1 } (без populate), он не изменяет данные. - person Taki; 09.04.2018