[英]Mongoose save with an existing document will not override the same object reference
我不知道为什么会这样,我想解释一下。
我的目标是对某些文档进行更新。 因为我仍然想使用猫鼬验证器,而不是先使用update命令,而是先获取文档,然后在其上使用save,因此仍然可以进行验证。
这是我的模型:
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);
那么它将起作用。
我看到的唯一解释是,尝试更改现有对象引用将不起作用,但是尝试保存新对象却可以。
为什么会这样?
因为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
优先。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.