2013-03-27 59 views
3

如何修改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(err); 
     obj['field'] = 'blah'; 
     callback(obj); 
    }); 
} 

obj.field将不包含blah而是由查询返回的原始值,就好像它是只读的。到底是怎么回事?

注:我的环境是Node.js的,快速,猫鼬和MongoDB

+0

可能重复[你为什么不能修改返回的数据一个Mongoose查询(例如:findById)](http://stackoverflow.com/questions/14504385/why-cant-you-modify-the-data-returned-by-a-mongoose-query-ex-findbyid) – steampowered 2015-08-21 03:00:22

回答

2

注:这是一个编辑,我原来的答复是相当不同的

所以这是一个有点混乱,但猫鼬返回MongooseDocument对象而不是普通的JSON对象。因此,使用obj上的.lean()方法将它变成JSON,然后从那里开始随意修改它。

感谢泽吉。

+0

谢谢Niall,但没有解决这个问题:'obj'still不变。我还应该精确地说我不想更新数据库中的对象,但只需使用它的一个副本,我可以将其修改用于其他目的。我已经尝试将'obj'复制到'cpy'并修改'cpy',但是我留下了同样的问题,即''cpy's也是只读的 – 2013-03-27 22:57:04

+0

hmm是否有任何理由使用.exec通过S.findOne({name:name},function(err,obj){..})'? – Niall 2013-03-27 23:02:44

+0

不好 - 试了两次,我得到了相同的结果 – 2013-03-27 23:04:57

2

doc从猫鼬返回的对象是某种只读的。从它那里得到一个可写的对象必须运行:

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

向下滚动到猫鼬文档阅读“转换”更多:link