Json Mongoose查询结果是否为只读?

Json Mongoose查询结果是否为只读?,json,node.js,mongodb,mongoose,Json,Node.js,Mongodb,Mongoose,如何修改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(er

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

所以这有点令人困惑,但是Mongoose返回MongooseDocument对象,而不是普通的JSON对象。因此,在obj上使用.lean()方法将其转换为JSON,然后根据需要对其进行修改

感谢Ze Jibe。

从mongoose返回的doc对象以某种方式是只读的。要从中获取可写对象,必须运行:

var writeableObject = doc.toObject()
writeableObject['field'] = 'blah'
res.send(writeableObject)

向下滚动到mongoose文档中的“Transform”以阅读更多内容:

谢谢Niall,但没有解决问题:
obj
仍保持不变。我还应该明确指出,我不想更新数据库中的对象,而只是使用它的副本,我可以出于其他目的修改它。我试着把
obj
复制到
cpy
并修改
cpy
,但我遇到了同样的问题,
cpy
似乎也是只读的。嗯,你有什么理由选择.exec over
S.findOne({name:name},function(err,obj){..})
?嗯,奇怪的是,我现在真的把东西扔出去了。在任何回调(obj)发生的地方会发生什么?那么它是只读的吗?听起来很奇怪,它是只读的。你让我感兴趣的是回调(obj)是一个
res.send(obj)
,因此我可以在浏览器中看到
obj
的内容。我还将
console.log()
放在
obj['field']='blah'
命令的周围,命令前后的
obj
内容是相同的(如控制台中打印的)。我不知道…你知道你在哪里有res.send(obj)?你能快速抛出一个obj['field']='blah'吗只是为了检查是否可以?可能会给出一个提示..可能重复的