【问题标题】:Unable to update mongoose model无法更新猫鼬模型
【发布时间】:2013-02-11 03:33:45
【问题描述】:

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

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 事件,因此它正在保存。我也没有对变体结构进行任何检查 - 即没有代码只允许代码和价格。我显然错过了一些东西,但几个小时后我就没有了想法。

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

    当您修改 variations 之类的无类型 Array 字段的内容时,您需要通过在修改后的文档上调用 markModified(path) 或随后的 save() 调用来通知 Mongoose 您已更改其值保存它。 See docs.

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

    【讨论】:

    • 如果您使用任何具有松散类型模式 (mongoose.Schema.Types.Mixed) 的深层对象,这也是正确的。并且从 Mongoose 4.5.8 开始,上述方法(markModified)仍然是一种工作方法。
    【解决方案2】:

    您必须使用 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");
    }
    

    另一种方法是用旧方式更改字段的值,无需通过设置器,然后手动将其标记为已修改:p.markModified('variations');

    在我看来,您应该始终使用 setter,因为它更具可读性。您可以只传递一个包含所有参数更改的 json 对象,它会安全地更新您真正想要更改的字段。

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 2021-10-27
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多