gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:59:04 25 4
gpt4 key购买 nike

我不明白为什么会出现这种行为,我希望得到一些解释。

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

然后它会起作用。

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

为什么会这样?

最佳答案

因为 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 优先。

关于node.js - 使用现有文档保存的 Mongoose 不会覆盖相同的对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30396951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com