Zde je ve vašem kódu několik chyb. V první řadě je třeba poznamenat, že nyní běžíte v "asynchronním" prostředí a musíte změnit způsob, jakým některé věci děláte.
Váš předchozí kód PHP je „blokující“, což znamená, že před přechodem na další řádek kódu musí být dokončen každý řádek kódu. To zahrnuje čekání, až databázový server provede aktualizaci a vrátí odpověď.
Nemůžete použít základní řídicí smyčky s funkcemi uvnitř, které se provádějí asynchronně. Místo toho potřebujete něco, co může zavolat další iteraci smyčky (nebo alespoň signalizovat, že jedna iterace je dokončena), jakmile asynchronní funkce "update" skutečně vrátí výsledek.
Druhým bodem je, že „nic se neaktualizovalo“, protože jste funkci neřekli, co má aktualizovat nebo čím aktualizovat odpovídající dokument.
Následující text je analogický s vaším původním výpisem PHP, ale upravený pro "asynchronní" metody také používá async.eachSeries
pro ovládání smyčky z async
knihovna:
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()
příkaz místo toho vrátí dokument, který byl změněn a s úpravami, pouze pokud o ně požádáte pomocí { "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
}
);
Pokud chcete přidat více prvků pole najednou nebo pokud máte dokonce jeden prvek přímo v poli, použijte $each
modifikátor na $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
}
);