Mongoose: findOneAndUpdate не возвращает обновленный документ

Ниже мой код

var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var Cat = mongoose.model('Cat', { name: String, age: {type: Number, default: 20}, create: {type: Date, default: Date.now} }); Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){ if(err){ console.log("Something wrong when updating data!"); } console.log(doc); }); 

У меня уже есть запись в моей базе данных mongo, и я хотел бы запустить этот код для обновления имени, для которого возраст равен 17, а затем распечатать результат в конце кода.

Однако почему я все еще получаю тот же результат от консоли (не изменяю имя), но когда я иду в командную строку mongo db и набираю «db.cats.find ();». Результат был изменен.

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

Мой вопрос: данные были изменены, но почему я все еще получил исходные данные в первый раз, когда console.log.

7 Solutions collect form web for “Mongoose: findOneAndUpdate не возвращает обновленный документ”

По умолчанию используется возврат неизмененного документа. Если вы хотите, чтобы новый, обновленный документ возвращался, вам нужно передать дополнительный аргумент: объект с new свойством, установленным в true .

http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

Запрос # findOneAndUpdate

 function(error, doc) { // error: any errors that occurred // doc: the document before updates are applied if `new: false`, or after updates if `new = true` } 

Доступные Варианты

new : bool – если true, верните измененный документ, а не оригинал. по умолчанию – false (изменено в 4.0)

Итак, если вы хотите обновить результат в переменной doc :

 Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, function(err, doc){ if(err){ console.log("Something wrong when updating data!"); } console.log(doc); }); 

Для тех, кто использует драйвер Node.js вместо Mongoose, вы захотите использовать {returnOriginal:false} вместо {new:true} .

По умолчанию findOneAndUpdate возвращает исходный документ. Если вы хотите, чтобы он возвратил измененный документ, передайте объект функции { new: true } функции:

 Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) { }); 

Таким образом, «findOneAndUpdate» требует опцию возврата исходного документа. И, вариант:

Оболочка MongoDB

{returnNewDocument: true}

Ссылка: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

Мангуста

{new: true}

Ссылка: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

Node.js API-интерфейс драйвера MongoDB:

{returnOriginal: false}

Ссылка: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate

Для тех, кто наткнулся на это, используя стиль ES6 / ES7 с собственными обещаниями, вот шаблон, который вы можете принять …

 const user = { id: 1, name: "Fart Face 3rd"}; const userUpdate = { name: "Pizza Face" }; try { user = await new Promise( ( resolve, reject ) => { User.update( { _id: user.id }, userUpdate, { upsert: true, new: true }, ( error, obj ) => { if( error ) { console.error( JSON.stringify( error ) ); return reject( error ); } resolve( obj ); }); }) } catch( error ) { /* set the world on fire */ } 

Это обновленный код для findOneAndUpdate . Оно работает.

 db.collection.findOneAndUpdate( { age: 17 }, { $set: { name: "Naomi" } }, { returnNewDocument: true } ) 

Если вы хотите вернуть измененный документ, вам нужно установить ссылку API {new:true} API, вы можете использовать Cat.findOneAndUpdate(conditions, update, options, callback) // executes

Взятый официальным API Mongoose http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate, вы можете использовать следующие параметры:

 A.findOneAndUpdate(conditions, update, options, callback) // executes A.findOneAndUpdate(conditions, update, options) // returns Query A.findOneAndUpdate(conditions, update, callback) // executes A.findOneAndUpdate(conditions, update) // returns Query A.findOneAndUpdate() // returns Query 

Другая реализация, которая не выражена на официальной странице API, является тем, что я предпочитаю использовать, это реализация базы данных Promise которая позволяет вам иметь .catch где вы можете иметь дело со всей вашей различной ошибкой.

  let cat: catInterface = { name: "Naomi" }; Cat.findOneAndUpdate({age:17}, cat,{new: true}).then((data) =>{ if(data === null){ throw new Error('Cat Not Found'); } res.json({ message: 'Cat updated!' }) console.log("New cat data", data); }).catch( (error) => { /* Deal with all your errors here with your preferred error handle middleware / method */ res.status(500).json({ message: 'Some Error!' }) console.log(error); }); 
  • socket.io комнаты или namespacing?
  • Как перейти на более раннюю версию Node.js
  • Каковы различия между node.js и узлом?
  • Как однопоточная неблокирующая IO-модель работает в Node.js
  • Использовать переменную в Jade include
  • Как включить обработчики маршрута в несколько файлов в Express?
  • Как получить полный URL в Express?
  • MongoDB / Mongoose запрос в определенную дату?
  • Отправить пользовательские данные вместе с handshakeData в socket.io?
  • Mongoose всегда возвращает пустой массив NodeJS
  • Как сделать кодировку Base64 в node.js?
  • Interesting Posts

    Как восстановить мой Logitech Anywhere MX?

    Почему этот Java-код находится в фигурных скобках ({}) вне метода?

    Полиморфизм против переопределения и перегрузки

    Используя FORFILES в пакете для удаления файлов tmp и bak старше недели

    Домашняя сеть с адаптерами Powerline, беспроводным маршрутизатором и точкой беспроводного доступа

    Настройка общей папки пакетов nuget для всех решений, когда некоторые проекты включены в несколько решений

    Перенаправить на именованный шаблон url непосредственно из urls.py в django?

    Настройка cookie с помощью WebEngine / WebView JavaFX

    Есть ли разница между режимами ожидания, приостановки и выключения DPMS на жидкокристаллических дислокациях?

    Delphi 2010: как сохранить целую запись в файл?

    Что означают запятые и пробелы в нескольких classах в CSS?

    В чем преимущества 10-битных мониторов?

    Как создать окно сообщения с параметрами «Да», «Нет» и «Диалоговое окно»?

    Как создать прозрачные изображения в MS Paint?

    Пагинация в веб-приложении REST

    Давайте будем гением компьютера.