为什么不能修改Mongoose查询返回的数据(例如:findById)

当我尝试更改由Mongoose Query返回的数据的任何部分时,它不起作用。

我昨天试图找出大约2个小时,用各种各样的_.clone() ,使用临时存储variables等。最后,当我虽然我疯了,我find了一个解决scheme。 所以我认为未来有人(fyuuuture!)可能有保存问题。

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

对于像这样的情况,你需要一个普通的JS对象而不是一个完整的模型实例,你可以像这样在查询链上调用lean()

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

这样data已经是一个普通的JS对象,你可以根据需要进行操作。

我认为Mongoose文档并没有把这个清楚,但查询中返回的数据(尽pipe你可以res.send()它)实际上是一个Mongoose Document对象,而不是一个JSON对象。 但是你可以用一行来解决这个问题

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