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

时间:2015-05-22 12:38:31

标签: node.js mongodb mongoose

我无法理解为什么这是行为,我想要一些解释。

我的目标是对某些文档进行更新。 因为我仍然想使用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);

然后它会起作用。

我看到的唯一解释是,尝试更改现有对象引用将不起作用,但尝试保存新对象确实有效。

为什么会这样?

1 个答案:

答案 0 :(得分:5)

由于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优先。