簡體   English   中英

無法更新貓鼬模型

[英]Unable to update mongoose model

我有一個奇怪的問題困擾着我。 我有一個模型:

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事件,該事件已正確觸發,因此可以保存。 我也沒有對版本結構進行任何檢查-即沒有代碼只允許代碼和價格。 我顯然缺少了一些東西,但幾個小時后我就沒了主意。

當您修改非類型化的內容Array像場variations ,你需要通知你已經通過調用改變了它的價值貓鼬markModified(path)在修改的文檔或隨后的save()調用不會保存。 參見docs

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

您必須使用set函數來更改屬性。 其背后的原因是貓鼬必須將字段標記為已修改才能保存到數據庫。

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');更改字段的值,然后手動將其標記為已修改: p.markModified('variations');

我認為您應該始終使用二傳手,因為它更易讀。 您只需傳遞一個包含所有參數更改的json對象,它就會安全地更新您真正想要更改的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM