无法更新mongoose模型
我有一个奇怪的问题,让我感到困惑。 我有一个模型:
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事件,所以它正在保存。 我也没有检查变体结构 – 即没有代码只允许代码和价格。 我明显失去了一些东西,但几个小时后,我跑出了想法。
当您修改类似variations
的无typesArray
字段的内容时,您需要通过在修改过的文档上调用markModified(path)
来通知Mongoose您已经更改了它的值,否则随后的save()
调用将不会保存它。 看文档 。
for(var i = p.variations.length - 1; i >=0; i--) { p.variations[i]['color'] = 'red'; } p.markModified('variations'); p.save(function(err) { ...
您必须使用set函数来更改属性。 这背后的原因是,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('variations');
在我看来,你应该总是使用setter,因为这样更具可读性。 你可以传递一个包含所有参数变化的json对象,它将安全地更新你真正想要更改的字段。