无法更新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对象,它将安全地更新你真正想要更改的字段。