17

私は私を困惑させている奇妙な問題を抱えています。私はモデルを持っています:

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

4

2 に答える 2

33

Arrayのような型指定されていないフィールドの内容を変更する場合は、変更したドキュメントvariationsを呼び出して値を変更したことをMongooseに通知する必要があります。そうしないとmarkModified(path)、その後のsave()呼び出しでは保存されません。ドキュメントを参照してください

  for(var i = p.variations.length - 1; i >=0; i--) {
    p.variations[i]['color'] = 'red';
  }
  p.markModified('variations');
  p.save(function(err) { ...
于 2013-02-25T21:15:27.590 に答える
3

プロパティを変更するには、 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');

私の意見では、これはより読みやすいので、常にセッターを使用する必要があります。パラメータのすべての変更を含むjsonオブジェクトを渡すだけで、本当に変更したいフィールドが安全に更新されます。

于 2013-02-25T23:06:05.507 に答える