Mongoose 查询结果是只读的吗?
Posted
技术标签:
【中文标题】Mongoose 查询结果是只读的吗?【英文标题】:Is Mongoose query result read-only? 【发布时间】:2013-03-18 05:44:07 【问题描述】:如何修改 Mongoose 查询返回的对象?
假设我们有以下架构:
var S = new mongoose.Schema( 'name': String, 'field': String );
我对结果做了如下查询和修改:
var retrieve = function(name, callback)
S.findOne( name: name ).exec(function (err, obj)
if (err) return handleError(err);
obj['field'] = 'blah';
callback(obj);
);
obj.field
不会包含blah
,而是查询返回的原始值,就好像它是只读的一样。怎么回事?
注意:我的环境是 Node.js、Express、Mongoose 和 MongoDB
【问题讨论】:
Why can't you modify the data returned by a Mongoose Query (ex: findById) 的可能重复项 【参考方案1】:注意:这是一个编辑,我原来的答案是相当不同的
所以这有点令人困惑,但 Mongoose 返回的是 MongooseDocument 对象,而不是普通的 JSON 对象。因此,在 obj 上使用 .lean() 方法将其转换为 JSON,然后您就可以根据需要开始对其进行更改。
感谢泽吉贝。
【讨论】:
感谢 Niall,但没有解决问题:obj
still 不变。我还应该准确地说我不想更新数据库中的对象,而只是使用它的副本,我可以修改它以用于其他目的。我尝试将obj
复制到cpy
并修改cpy
但我遇到了同样的问题,cpy
似乎也是只读的
嗯,你有什么理由选择 .exec 而不是 S.findOne(name: name, function (err,obj) .. )
?
嗯,奇怪,我现在只是把东西扔在那里。回调(obj)在哪里会发生什么?那么它是“只读”的吗?听起来很奇怪,它是只读的。你让我感兴趣
callback(obj) 是一个res.send(obj)
,所以我可以在浏览器中看到obj
的内容是什么。我还在obj['field'] = 'blah'
命令周围放置了console.log()
,并且在命令之前和之后obj
的内容是相同的(如控制台中打印的那样)。我一无所知...
你知道你在哪里有 res.send(obj) 吗?您能否快速发送obj['field'] = 'blah';
来检查它是否还可以?可能会给提示..【参考方案2】:
从 mongoose 返回的 doc 对象在某种程度上是只读的。要从中获取可写对象,您必须运行:
var writeableObject = doc.toObject()
writeableObject['field'] = 'blah'
res.send(writeableObject)
向下滚动到猫鼬文档中的“转换”以阅读更多信息:link
【讨论】:
以上是关于Mongoose 查询结果是只读的吗?的主要内容,如果未能解决你的问题,请参考以下文章