node.js - tutorial - Actualización del objeto anidado en mangosta
mongoose update (2)
He buscado muchas preguntas sobre objetos anidados, pero todo lo que encontré está relacionado con los arreglos [s].
Estoy buscando una actualización simple objeto anidado en mangosta.
Desde aquí http://mongoosejs.com/docs/guide.html
there is an example schema :
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
Una vez creado un documento,
¿Cómo puedo cambiar el número de favs más adelante?
No hay ningún documento para el mismo que pueda encontrar.
Esto es lo que hice:
blog.findById(entityId, function(err, mainDoc){
if(err || !mainDoc) return next(err || ''Document not found'');
var subDoc = mainDoc[''meta''];
if(subDoc){
subDoc = _.extend(subDoc, { favs : 56 }); //_ lib already available
console.log(mainDoc.get(''meta'')); //Prints the updated result with favs = 56 OK
mainDoc.save(function(err, doc){
console.log(doc.get(''meta'')); // prints the updated results with favs = 56 OK
});
} else next(''Not found'');
});
Todo funciona con el archivo y todas las consolas dan el resultado deseado.
Pero cuando cambio a la consola de mangosta y consulto el documento, no obtengo el resultado actualizado.
Sé que puede haber otras formas de lograr lo mismo, pero solo estoy buscando lo que estoy haciendo mal en este código en particular.
¿Por qué la consola, después de guardar el documento, proporciona datos incomparables de la base de datos?
Al habilitar la opción de depuración de mangosta, encontré la consulta en la que no hay datos para actualizar. Query incendios con $ set en blanco. {$ set: {}}
Si solo desea cambiar el valor de los favs
, puede usar una consulta más simple:
blog.findByIdAndUpdate(entityId, {$set: {''meta.favs'': 56}}, function(err, doc) {
console.log(doc);
});
El problema es que no puedes hacer nada con los datos de la mangosta una vez que la tienes aparte de enviarla al cliente.
SIN EMBARGO, existe el método Lean que lo hace para que luego pueda actualizar la información y hacer lo que quiera con ella.
Eso se vería así:
blog.findById(entityId).lean().exec(function (err, mainDoc) {
if (err || !mainDoc) {
return next(err || ''Document not found'');
}
var subDoc = mainDoc.meta;
if(subDoc){
subDoc.favs = 56;
blog.update({_id: entityId}, mainDoc, function(err, doc){
console.log(doc.get(''meta''));
});
} else {
next(''Not found'');
}
});