【问题标题】:Is Mongoose query result read-only?Mongoose 查询结果是只读的吗?
【发布时间】:2023-03-15 14:53:01
【问题描述】:

如何修改 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

【问题讨论】:

标签: json node.js mongodb mongoose


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2020-04-01
    • 2015-12-07
    • 2011-04-20
    • 2017-11-19
    相关资源
    最近更新 更多