Node.js 为什么可以';t修改Mongoose查询返回的数据(例如:findById)
当我试图更改Mongoose查询返回的数据的任何部分时,它没有任何效果 昨天我花了大约两个小时试图解决这个问题,使用了各种各样的Node.js 为什么可以';t修改Mongoose查询返回的数据(例如:findById),node.js,mongoose,Node.js,Mongoose,当我试图更改Mongoose查询返回的数据的任何部分时,它没有任何效果 昨天我花了大约两个小时试图解决这个问题,使用了各种各样的\uuu.clone()s,使用了临时存储变量,等等。最后,就在我觉得自己快要发疯的时候,我找到了一个解决方案。所以我想未来可能会有人(fyuuture!)会有保存问题 Survey.findById(req.params.id, function(err, data){ var len = data.survey_questions.length; v
\uuu.clone()
s,使用了临时存储变量,等等。最后,就在我觉得自己快要发疯的时候,我找到了一个解决方案。所以我想未来可能会有人(fyuuture!)会有保存问题
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);
}
});
});
});
我认为Mongoose文档没有足够清楚地说明这一点,但是查询中返回的数据(尽管您可以res.send()它)实际上是一个Mongoose文档对象,而不是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);
}
});
});
});
对于这样的情况,您需要一个普通的JS对象而不是一个完整的模型实例,您可以像这样调用查询链:
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对象,您可以根据需要进行操作。Btw@johnyhk只是想再次表示感谢。一年半后,他正在帮助一个客户调试一些东西。他花了一个周末试图弄明白一些事情,结果是因为他试图修改猫鼬的物体;P2年后,它仍在被摧毁。甚至没有意识到精益()的存在。@Fizzixaggregate
总是以普通对象的形式提供结果,所以没有必要在三年后花费整整一个小时来尝试解决它。救了我一整天!谢谢你!这确实有帮助,但是为什么不可能修改对象呢?它是什么类型的特殊对象?你也可以使用它,它的功能与toJSON()
相同,但名称不太容易混淆。这也会消除开发人员使用的虚拟对象吗?TypeError:data.toObject不是一个函数
我得到了这个,与toJSON
一样,而不是修改结果
,我可以修改结果。_doc
@Luzan Baral这是因为您正在对数组对象使用这些函数。使用JSON.parse(JSON.stringify(data))
代替object数组