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);
});
Entonces, "findOneAndUpdate" requiere una opción para devolver el documento original. Y, la opción es:
Shell MongoDB
{returnNewDocument: true}
Ref: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
Mangosta
{new: true}
Ref: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate
Node.js MongoDB Driver API:
{returnOriginal: false}
Ref: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate
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);
});