我无法理解为什么这是行为,我想要一些解释。
我的目标是对某些文档进行更新。 因为我仍然想使用mongoose验证器,而不是使用更新命令我首先得到文件,然后我使用保存,所以这样我仍然可以进行验证。
这是我的模特:
var JobSchema = new Schema({
_id: {type: Schema.Types.ObjectId, required: true},
_user: { type: Schema.Types.ObjectId, ref: 'User', required: true},
data: {type: Object, required: true},
status: {type: String, required: true}
}, {
strict: true,
minimize: false
});
当我使用我自己的技术更新文档时,我正在更新数据对象,如下所示:
_.extend(doc.data, newData);
但不会存储新数据。
如果相反我这样做:
var lastData = doc.data;
doc.data = data;
_.extend(doc.data, lastData);
然后它会起作用。
我看到的唯一解释是,尝试更改现有对象引用将不起作用,但尝试保存新对象确实有效。
为什么会这样?
答案 0 :(得分:5)
由于data
的定义类型为Object
,因此当您通过为其覆盖值来覆盖它时,Mongoose仅检测对其的更改。当您只更改其中的字段时,您需要通过调用markModified
通知Mongoose:
_.extend(doc.data, newData);
doc.markModified('data');
您还可以extend
创建一个结合doc.data
和newData
的新对象,以便将结果分配给doc.data
并触发更改检测:
doc.data = _.extend({}, doc.data, newData);
extend
按顺序应用每个对象,因此newData
优先。