Ci sono alcune cose che non vanno nel tuo codice qui. Innanzitutto notare che ora stai eseguendo in un ambiente "asincrono" e devi cambiare il modo di pensare su come fai alcune cose.
Il tuo codice PHP precedente è "bloccante", il che significa che ogni riga di codice deve essere completata prima di passare alla riga di codice successiva. Ciò include l'attesa che un server di database esegua un aggiornamento e restituisca la risposta.
Non è possibile utilizzare cicli di controllo di base con funzioni al loro interno che funzionano in modo asincrono. Invece è necessario qualcosa che possa chiamare l'iterazione successiva del ciclo (o almeno segnalare che una singola iterazione è completa) una volta che la funzione asincrona "aggiornamento" ha effettivamente restituito un risultato.
Il secondo punto qui è che "niente di aggiornato" perché non hai detto alla funzione cosa aggiornare o con cosa aggiornare il documento abbinato.
Quanto segue è analogo al tuo elenco PHP originale, ma regolato per i metodi "async" utilizza anche il async.eachSeries
per il controllo del ciclo da async
biblioteca:
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
}
);
Il .findOneAndUpdate()
il comando invece restituisce il documento che è stato modificato e con le modifiche solo se le chiedi con { "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
}
);
Se vuoi aggiungere più elementi di array contemporaneamente, o se hai anche un singolo elemento direttamente in un array, usa $each
modificatore di $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
}
);