Mongoose findByIdAndUpdate не повертає правильну модель


99

У мене проблема, якої я раніше не бачив, оскільки Mongoose findByIdAndUpdate не повертає правильну модель у зворотний виклик.

Ось код:

    var id = args._id;
    var updateObj = {updatedDate: Date.now()};
    _.extend(updateObj, args);

    Model.findByIdAndUpdate(id, updateObj, function(err, model) {
        if (err) {
            logger.error(modelString +':edit' + modelString +' - ' + err.message);
            self.emit('item:failure', 'Failed to edit ' + modelString);
            return;
        }
        self.emit('item:success', model);
    });

Оригінальний документ у базі даних виглядає так:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 1'
}

Входить updateObj виглядає так:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 2'
}  

Модель, повернута із зворотного виклику, ідентична початковій моделі, а не оновленому Obj. Якщо я запитую db, він був оновлений правильно. Це просто не повертається з бази даних.

Це відчувається як помилка "дурного користувача", але я не бачу цього. Будь-які ідеї дуже вдячні.


1
Це дивовижне місце. І нагадування, чому мені потрібно підтримувати збіг усіх своїх проектів у версіях, оскільки цей пакет пройшов власні модульні тести. Дякую.
JonRed

Відповіді:


294

У Mongoose 4.0 значення за замовчуванням для newпараметра findByIdAndUpdate(та findOneAndUpdate) змінено на false(див. № 2262 у примітках до випуску ). Це означає, що вам потрібно явно встановити параметр, щоб trueотримати нову версію документа, після застосування оновлення:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

5
Також потрапив під увагу змінами повернутих значень методу 'create'. Вітаю, друже, я б двічі проголосував, якби міг.
JonRed

4
Також помістіть PR для оновлених документів про проект мангуста, тому, сподіваємось, це не застане когось іншого.
JonRed

3
О хлопче, дякую тобі @JohnnyHK. Це мене зруйнувало. Звичайно, я хочу повернути новий. Можливо, більше відповідає API, але насправді не має здорового глузду ... якщо я щось оновлю, хотів би побачити зміни. Спасибі мангуст ...
Peege151

21
Оце Так! Яке жахливе рішення вони прийняли! Це єдиний сенс робити пошук у першу чергу замість оновлення.
Адам Локхарт,

9
Я не розумію, чому хтось
воліє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.