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.

По умолчанию используется возврат неизмененного документа. Если вы хотите, чтобы новый, обновленный документ возвращался, вам нужно передать дополнительный аргумент: объект с 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); }); 
  • Как я могу построить свой тестовый пакет асинхронно?
  • Как вы извлекаете данные POST в Node.js?
  • Как аутентифицировать запросы Supertest с паспортом?
  • Управление сеансами в Node.js?
  • Как отделить маршруты от Node.js и Express 4?
  • Базовая проверка подлинности HTTP в Node.JS?
  • как создать неблокирующую асинхронную функцию в node.js?
  • Sails.js заполняют вложенные ассоциации
  • Node.js: настройка переменных среды
  • Как перенаправить URL браузера пользователя на другую страницу в Nodejs?
  • Шифрование с помощью модуля Node.js Crypto и расшифровка с помощью Java (в приложении для Android)
  • Давайте будем гением компьютера.