Javascript 无法更新mongoose模型
我有一个奇怪的问题困扰着我。我有一个模型:Javascript 无法更新mongoose模型,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有一个奇怪的问题困扰着我。我有一个模型: var Model = new Schema({ name: String, variations: Array }); 变体条目如下所示: [ {code: '', price: '' }, {code: '', price: '' }] 我需要添加一个新字段,比如“颜色”。所以我这样做是为了批量更新: Model.find().exec(function(err, products) { if (!err) {
var Model = new Schema({
name: String,
variations: Array
});
变体条目如下所示:
[ {code: '', price: '' }, {code: '', price: '' }]
我需要添加一个新字段,比如“颜色”。所以我这样做是为了批量更新:
Model.find().exec(function(err, products) {
if (!err) {
products.forEach(function(p) {
for(var i = p.variations.length - 1; i >= 0; i--) {
p.variations[i]['color'] = 'red';
// This shows all existing variations
// with the new color feed - correct
console.log(p.variations[i]);
}
p.save(function(err) {
if (!err) {
console.log("Success");
} else {
console.log(err);
}
});
});
}
});
但是,没有设置“颜色”字段-如果我再次查看并注释掉
p.variations[I]['color']='red'代码>行,则它不显示。我似乎不明白它为什么这样做。我有一个正确触发的onSave事件,因此正在保存。我也没有检查变体结构,即没有只允许代码和价格的代码。很明显,我遗漏了一些东西,但几个小时后我的想法就没有了。当您修改非类型的数组
字段(如变体
)的内容时,您需要通过在修改的文档或后续的保存()上调用markModified(path)
来通知Mongoose您已经更改了它的值
call无法保存它
您必须使用功能来更改属性。其背后的原因是mongoose必须将字段标记为已修改,以便保存到数据库中
for(var i = p.variations.length - 1; i >=0; i--) {
p.variations[i].set({"color":"red", "code":"herr"});
// or
p.variations[i].set("color":"red");
p.variations[i].set("code":"herr");
}
另一种方法是以旧方式更改字段的值,而不必麻烦setter,然后手动将其标记为已修改:p.markModified('variances')代码>
在我看来,您应该始终使用setter,因为它更具可读性。您只需传递一个包含所有参数更改的json对象,它将安全地更新您真正想要更改的字段。如果您使用任何具有松散类型架构(mongoose.schema.Types.Mixed)的深层对象,这也是正确的。截至Mongoose 4.5.8,上述方法(markModified)仍然是实现这一点的有效方法。
for(var i = p.variations.length - 1; i >=0; i--) {
p.variations[i].set({"color":"red", "code":"herr"});
// or
p.variations[i].set("color":"red");
p.variations[i].set("code":"herr");
}