2017-10-31 6 views
0

forEach()ループ内のすべてのドキュメントを更新しようとしていますが、更新は行われていません。 forEach()が動作していることを確認するたびに、各繰り返しを記録しています。しかし、何らかの理由でupdate()が動作していません。上述したように、私はconsole.log()を参照してくださいforEach()ループ内でドキュメントを更新するにはどうすればよいですか?

myModelSchema.methods.updateMyModel = function (cb) { 
var myModel = this.model('MyModel'); 

myModel.find({}, function (err, items) { 
    items.forEach(function (item) { 
     console.log('item._id = ' + item._id); 
     myModel.update(
      { 
       _id: item._id 
      }, 
      { 
       $set: { 
        "some_array.0.some_field": item.some_field 
       } 
      } 
     ); 
    }) 
}); 
}; 

が、文書が更新されていません。

は、ここに私のコードです。私は間違って何をしていますか?

+0

**すべてのドキュメント**を特定の配列要素の定数値に設定するだけではありませんか?実際の「更新する値」が各反復で変更されない限り、ループする必要はありません。あなたがしているように見えるのは、単純な単一の更新ステートメントだけです: 'myModel.update({}、{" $ set ":{" some_array.0.some_field ":someVariable}}、{" multi ":true} (エラー、レスポンス)=> {/ *レスポンスオブジェクト* /}) '。とにかく '.update()'にコールバックがないので、実行されないので、コールバックの完了時にループの実行を制御する必要があります。 –

+0

「ループする」方法ははるかに優れていますが、「ループ」で実際に何をしようとしているのか説明できない場合を除いて、単純にその必要はありません。最新のAPIの '' multi "'パラメータを "暗黙に"含むすべてのマッチしたもの、あるいはupdateMany()を更新するために '' multi "'を適用するだけです。 –

答えて

0

Neil Lunnが指摘したように、私はコールバックを持っていませんでした。ここに解決策があります:

myModel.find({}, function (err, items) { 
    items.forEach(function (item) { 
     myModel 
      .update(
       { 
        _id: item._id 
       }, 
       { 
        $set: { 
         "some_array.0.some_field": item.some_field 
        } 
       } 
      ) 
      .exec() 
      .then(function (data) { 
       console.log('It works'); 
      }) 
      .catch(function (err) { 
       console.log(err); 
      }); 
    }) 
}); 

ドキュメント内のフィールドを同じドキュメント内のフィールドの値で更新する必要がありました。上記のコードは動作します。

+0

今すぐ動作する可能性があります。しかし、結局それは失敗するだろうし、 "コールスタックを超過して"非常にひどくそうです。これは実際にあなたが実際に求めている質問の質問をする人々と実際にコミュニケーションする理由です。 –

関連する問題