W twoim kodzie jest kilka błędów. Przede wszystkim należy zauważyć, że pracujesz teraz w środowisku „asynchronicznym” i musisz zmienić sposób myślenia o tym, jak robisz niektóre rzeczy.
Twój poprzedni kod PHP jest „blokujący”, co oznacza, że każdy wiersz kodu musi zostać ukończony przed przejściem do następnego wiersza kodu. Obejmuje to oczekiwanie, aż serwer bazy danych wykona aktualizację i zwróci odpowiedź.
Nie można używać podstawowych pętli sterowania z funkcjami wewnątrz nich działającymi asynchronicznie. Zamiast tego potrzebujesz czegoś, co może wywołać następną iterację pętli (lub przynajmniej zasygnalizować, że pojedyncza iteracja jest zakończona ), gdy funkcja asynchroniczna „update” faktycznie zwróci wynik.
Drugą kwestią jest to, że „nic nie zostało zaktualizowane”, ponieważ nie powiedziałeś funkcji, co zaktualizować lub czym zaktualizować dopasowany dokument.
Poniższe jest analogiczne do oryginalnego listingu PHP, ale dostosowane do metod "async" używaj również async.eachSeries
do sterowania pętlą z async
biblioteka:
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()
polecenie zamiast tego zwraca dokument, który został zmodyfikowany i z modyfikacjami tylko wtedy, gdy poprosisz o nie za 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
}
);
Jeśli chcesz dodać wiele elementów tablicy naraz lub jeśli masz nawet jeden element bezpośrednio w tablicy, użyj $each
modyfikator $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
}
);