为啥不能修改 Mongoose 查询返回的数据(例如:findById)
Posted
技术标签:
【中文标题】为啥不能修改 Mongoose 查询返回的数据(例如:findById)【英文标题】:Why can't you modify the data returned by a Mongoose Query (ex: findById)为什么不能修改 Mongoose 查询返回的数据(例如:findById) 【发布时间】:2013-01-08 09:19:31 【问题描述】:当我尝试更改 Mongoose 查询返回的数据的任何部分时,它没有任何效果。
昨天我试图解决这个问题大约 2 小时,各种_.clone()
s,使用临时存储变量等。最后,就在我发疯的时候,我找到了解决方案。所以我认为将来有人(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);
);
);
);
【问题讨论】:
How do you turn a Mongoose document into a plain object?的可能重复 ***.com/q/9952649/4748042的可能重复 【参考方案1】:对于这样的情况,您需要一个普通的 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对象,你可以根据需要进行操作。
【讨论】:
顺便说一句 @JohnnyHK 只是想再次表示感谢。一年半后帮助客户调试了一些东西。他花了一个周末试图弄清楚一些事情,原来是因为他试图修改 Mongoose 对象;P 2 年过去了,但仍然在粉碎它。甚至没有意识到lean() 在那里。 @Fizzixaggregate
始终将其结果作为普通对象提供,因此不需要lean()
。
3 年后,花了整整一个小时试图弄清楚。拯救了我的一整天!谢谢
谢谢!这确实有帮助,但是为什么无法修改对象呢?它是一种什么样的特殊物体?【参考方案2】:
我认为 Mongoose 文档并没有说明这一点,但查询中返回的数据(尽管您可以 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);
);
);
);
【讨论】:
您也可以使用toObject()
,它与toJSON()
的作用相同,但名称不那么容易混淆。
这是否也能摆脱开发者使用的虚拟设备?
TypeError: data.toObject is not a function
我知道了,和toJSON
一样
我没有修改result
,而是修改了result._doc
。
@Luzan Baral 那是因为您将这些函数用于 Array 对象。使用JSON.parse(JSON.stringify(data))
代替对象数组以上是关于为啥不能修改 Mongoose 查询返回的数据(例如:findById)的主要内容,如果未能解决你的问题,请参考以下文章