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

103

У меня проблема, которую я раньше не видел, когда 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. Если я запрашиваю базу данных, она была обновлена ​​правильно. Это просто не возвращается из базы данных.

Это похоже на ошибку «глупого пользователя», но я ее не вижу. Любые идеи приветствуются.

JonRed
источник
1
Это потрясающее место. И напоминание, почему мне нужно, чтобы все мои проекты совпадали по версиям, поскольку этот пакет проходил собственные модульные тесты. Спасибо.
JonRed

Ответы:

299

В Mongoose 4.0 значение по умолчанию для newопции findByIdAndUpdatefindOneAndUpdate) было изменено на false(см. № 2262 в примечаниях к выпуску ). Это означает, что вам необходимо явно указать параметр для trueполучения новой версии документа после применения обновления:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...
JohnnyHK
источник
5
Также был пойман изменениями в возвращаемых значениях метода create. Ура, дружище, я бы проголосовал дважды, если бы мог.
JonRed
4
Также поставьте PR для обновленных документов по проекту мангуста, так что, надеюсь, он никого не поймает.
JonRed
3
О, мальчик, спасибо @JohnnyHK. Это меня разбило. Конечно, я хочу вернуть новую. Может быть, более совместим с API, но не совсем со здравым смыслом ... если я что-то обновлю, я бы хотел увидеть изменения. Спасибо, мангуст ...
Peege151
21
Вот это да! Какое ужасное решение они приняли! Это единственный смысл в первую очередь выполнять поиск, а не обновление.
Адам Локхарт,
9
Я не понимаю, почему кто-то предпочел бы в ответе старый документ вместо нового
emilioriosvz