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");
}