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,但没有解决问题:objstill 不变。我还应该准确地说我不想更新数据库中的对象,而只是使用它的副本,我可以修改它以用于其他目的。我尝试将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 查询结果是只读的吗?的主要内容,如果未能解决你的问题,请参考以下文章

mongoose基本增删改查

基于 Mongoose 的应用架构

猫鼬承诺与蓝鸟和打字稿

Moogose的基本连接以及增删改查操作

Mongoose更新嵌套数组

mongoose的基本操作