一尘不染

无法更新猫鼬模型

node.js

我有一个让我感到困惑的奇怪问题。我有一个模型:

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事件,该事件已正确触发,因此可以保存。我也没有对版本结构进行任何检查-
即没有代码只允许代码和价格。我显然缺少了一些东西,但几个小时后我就没了主意。


阅读 196

收藏
2020-07-07

共1个答案

一尘不染

当您修改无类型Array字段(如)的内容时variations,您需要通过调用markModified(path)已修改的文档来通知Mongoose您已更改其值,否则后续save()调用将无法保存它。参见docs

  for(var i = p.variations.length - 1; i >=0; i--) {
    p.variations[i]['color'] = 'red';
  }
  p.markModified('variations');
  p.save(function(err) { ...
2020-07-07