繁体   English   中英

用现有文档保存的猫鼬不会覆盖相同的对象引用

[英]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.datanewData的新对象,以便可以将其结果分配给doc.data并触发更改检测:

doc.data = _.extend({}, doc.data, newData);

extend按顺序应用每个对象,因此newData优先。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM