ここのコードにはいくつか問題があります。何よりもまず注意すべきことは、現在「非同期」環境で実行しているため、いくつかのことを行う方法についての考え方を変える必要があるということです。
以前のPHPコードは「ブロッキング」です。つまり、次のコード行に進む前に、コードのすべての行を完了する必要があります。これには、データベースサーバーが更新を実行して応答を返すのを待つことも含まれます。
非同期で実行される関数を内部に持つ基本的な制御ループを使用することはできません。代わりに、非同期関数「update」が実際に結果を返したら、ループの次の反復を呼び出すことができる(または少なくとも1つの反復が完了したことを通知する)ものが必要です。
ここでの2番目のポイントは、何を更新するか、または一致したドキュメントを何で更新するかを関数に指示しなかったため、「何も更新されない」ということです。
以下は、元のPHPリストに類似していますが、「非同期」メソッド用に調整された場合も、async.eachSeries
async
からのループ制御の場合
ライブラリ:
async.eachSeries(
tables,
function(table,callback) {
var tablename = table.tablename;
delete table.tablename; // just remove the key rather than re-construct
OutAccept.update(
{ "tablename": tablename },
{ "$push": { "inventar": table } },
function(err,numAffected) {
console.log( numAfftected ); // tells you how many are updated or nothing
callback(err)
}
);
},
function(err) {
// comes here on completion of all array items
}
);
.findOneAndUpdate()
代わりに、コマンドは、{ "new": true }
で要求した場合にのみ、変更されたドキュメントを返します。
async.eachSeries(
tables,
function(table,callback) {
var tablename = table.tablename;
delete table.tablename;
OutAccept.findOneAndUpdate(
{ "tablename": tablename },
{ "$push": { "inventar": table } },
{ "new": true },
function(err,doc) {
console.log( doc ); // shows the modified document
callback(err)
}
);
},
function(err) {
// comes here on completion of all array items
}
);
一度に複数の配列要素を追加する場合、または配列に直接単一の要素がある場合は、 $each
$push
への修飾子
:
var inventor = [
{
"ean": "2",
"name": "name2",
"runtime": "0",
"art": "null",
"marker": "null",
"stammkost": "null",
"accepted": "0"
},
{
"ean": "1",
"name": "name1",
"runtime": "0",
"art": "null",
"marker": "null",
"stammkost": "null",
"accepted": "0"
}
];
OutAccept.update(
{ "tablename": tablename },
{ "$push": { "inventar": { "$each": inventar } } },
function(err,numAffected) {
// work in here
}
);