Ada beberapa hal yang salah dalam kode Anda di sini. Pertama dan terpenting yang perlu diperhatikan adalah bahwa Anda sedang berjalan di lingkungan "async" sekarang dan Anda perlu mengubah pemikiran tentang cara Anda melakukan beberapa hal.
Kode PHP Anda sebelumnya adalah "blocking", yang berarti bahwa setiap baris kode harus diselesaikan sebelum pindah ke baris kode berikutnya. Ini termasuk menunggu server database melakukan pembaruan dan mengembalikan respons.
Anda tidak dapat menggunakan loop kontrol dasar dengan fungsi di dalamnya yang bekerja secara asinkron. Alih-alih, Anda memerlukan sesuatu yang dapat memanggil iterasi berikutnya dari loop (atau setidaknya memberi sinyal bahwa satu iterasi selesai) setelah fungsi asinkron "pembaruan" benar-benar mengembalikan hasil.
Poin kedua di sini adalah "tidak ada yang diperbarui" karena Anda tidak memberi tahu fungsi apa yang harus diperbarui atau dengan apa memperbarui dokumen yang cocok.
Berikut ini analog dengan daftar PHP asli Anda, tetapi disesuaikan untuk metode "async" juga menggunakan async.eachSeries
untuk kontrol loop dari async
perpustakaan:
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()
command sebagai gantinya mengembalikan dokumen yang telah dimodifikasi dan dengan modifikasi hanya jika Anda memintanya dengan { "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
}
);
Jika Anda ingin menambahkan Beberapa elemen array sekaligus, atau jika Anda memiliki satu elemen secara langsung dalam array, gunakan $each
pengubah ke $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
}
);