¿Por qué no puedes modificar los datos devueltos por una consulta Mongoose (por ejemplo: findById)?
Cuando intento cambiar cualquier parte de los datos devueltos por una consulta Mongoose, no tiene ningún efecto.
Ayer estuve tratando de resolver esto durante aproximadamente 2 horas, con todo tipo de _.clone()
mensajes de correo electrónico, usando variables de almacenamiento temporal, etc. Finalmente, justo cuando pensaba que me estaba volviendo loco, encontré una solución. Así que pensé que alguien en el futuro (¡fyuuuture!) podría tener el problema de guardar.
Survey.findById(req.params.id, function(err, data){
var len = data.survey_questions.length;
var counter = 0;
_.each(data.survey_questions, function(sq){
Question.findById(sq.question, function(err, q){
sq.question = q; //has no effect
if(++counter == len) {
res.send(data);
}
});
});
});
Para casos como este en los que desea un objeto JS simple en lugar de una instancia de modelo completa, puede llamar lean()
a la cadena de consulta de esta manera:
Survey.findById(req.params.id).lean().exec(function(err, data){
var len = data.survey_questions.length;
var counter = 0;
_.each(data.survey_questions, function(sq){
Question.findById(sq.question, function(err, q){
sq.question = q;
if(++counter == len) {
res.send(data);
}
});
});
});
De esta manera data
ya es un objeto JS simple que puedes manipular según sea necesario.
Creo que la documentación de Mongoose no deja esto lo suficientemente claro, pero los datos devueltos en la consulta (aunque puede res.send()) son en realidad un objeto de documento de Mongoose y NO un objeto JSON. Pero puedes arreglar esto con una línea...
Survey.findById(req.params.id, function(err, data){
var len = data.survey_questions.length;
var counter = 0;
var data = data.toJSON(); //turns it into JSON YAY!
_.each(data.survey_questions, function(sq){
Question.findById(sq.question, function(err, q){
sq.question = q;
if(++counter == len) {
res.send(data);
}
});
});
});