sistema node guide documentación diccionario community about node.js mongodb mongoose

node.js - documentación - node js guide



Mangosta: findOneAndUpdate no devuelve el documento actualizado (8)

Abajo está mi código

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); });

Ya tengo algún registro en mi base de datos de mongo y me gustaría ejecutar este código para actualizar el nombre para el que tiene 17 años y luego imprimir el resultado al final del código.

Sin embargo, por qué sigo obteniendo el mismo resultado de la consola (no el nombre modificado) pero cuando voy a la línea de comando mongo db y db.cats.find(); " db.cats.find(); ". El resultado vino con nombre modificado.

Luego vuelvo a ejecutar este código nuevamente y el resultado se modifica.

Mi pregunta es: si los datos se modificaron, ¿por qué todavía tengo datos originales por primera vez cuando console.log?


A continuación se muestra la consulta de findOneAndUpdate de mangosta. Aquí new: true se usa para obtener el documento actualizado y los fields se usan para obtener campos específicos.

p.ej. findOneAndUpdate(conditions, update, options, callback)

await User.findOneAndUpdate({ "_id": data.id, }, { $set: { name: "Amar", designation: "Software Developer" } }, { new: true, fields: { ''name'': 1, ''designation'': 1 } }).exec();


El valor predeterminado es devolver el documento original sin modificaciones . Si desea que se devuelva el documento nuevo y actualizado, debe pasar un argumento adicional: un objeto con la new propiedad establecida en true .

De los documentos de mangosta :

Consulta # findOneAndUpdate

Model.findOneAndUpdate(conditions, update, options, (error, doc) => { // error: any errors that occurred // doc: the document before updates are applied if `new: false`, or after updates if `new = true` });

Opciones Disponibles

  • new : bool: si es verdadero , devuelve el documento modificado en lugar del original. el valor predeterminado es falso (cambiado en 4.0)

Entonces, si desea el resultado actualizado en la variable doc :

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



Este es el código actualizado para findOneAndUpdate . Funciona.

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


Para cualquiera que use el controlador Node.js en lugar de Mongoose, querrá usar {returnOriginal:false} lugar de {new:true} .


Para quien tropezó con esto usando el estilo ES6 / ES7 con promesas nativas, aquí hay un patrón que puede adoptar ...

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 */ }


Por defecto, findOneAndUpdate devuelve el documento original. Si desea que devuelva el documento modificado, pase un objeto de opciones { new: true } a la función:

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


Si desea devolver el documento alterado, debe establecer la opción {new:true} Referencia de API que puede usar Cat.findOneAndUpdate(conditions, update, options, callback) // executes

Tomado por la API oficial de Mongoose http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate , puede usar los siguientes parámetros

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

Otra implementación que no está expresada en la página oficial de la API y que prefiero usar es la implementación base de Promise que le permite tener .catch donde puede lidiar con todos sus diversos errores allí.

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); });