2013-02-25 11 views
14

私は私を困惑させる奇妙な問題があります。 - 「色」と言う私は、新しいフィールドを追加する必要がマングースモデルを更新できません

[ {code: '', price: '' }, {code: '', price: '' }] 

var Model = new Schema({ 
    name: String, 
    variations: Array 
}); 

バリエーションエントリ次のようになります。私は、モデルを持っています。だから私は、バッチ更新にこれをやっている:

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イベントが正しくトリガされているので、保存しています。バリエーション構造のチェックもありません。つまり、コードと価格のみを許可するコードはありません。私は明らかに何かが不足していますが、数時間後にアイデアがなくなりました。

答えて

26

あなたはvariationsのような型指定のないArrayフィールドの内容を変更すると、あなたが変更された文書や、その後のsave()呼び出し、それを保存しないだろうにmarkModified(path)を呼び出すことによって、その値を変更したマングースを通知する必要があります。 See docs

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

緩い型のスキーマを持つディープオブジェクト(mongoose.Schema.Types.Mixed)を使用する場合も同様です。また、Mongoose 4.5.8以降、上記のメソッド(markModified)はこれを実行するための作業方法です。 – SylonZero

3

あなたは、プロパティを変更するset機能を使用する必要があります。その背後にある理由は、データベースに保存するために、mongooseがフィールドを変更済みとしてマークする必要があるということです。私の意見でp.markModified('variations');

これがあるので、あなたは常にセッターを使用する必要があります。

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

代替は修正され、手動でそれをマークし、その後、troughtセッターを介さずに、古い方法を、フィールドの値を変更することですより読みやすい。パラメータ内のすべての変更を含むjsonオブジェクトを渡すことができます。実際にはに変更したいフィールドを更新します。

関連する問題