Há algumas coisas erradas no seu código aqui. Primeiro e mais importante notar é que você está rodando em um ambiente "assíncrono" agora e você precisa mudar o pensamento sobre como você faz algumas coisas.
Seu código PHP anterior está "bloqueando", o que significa que cada linha de código deve ser concluída antes de passar para a próxima linha de código. Isso inclui esperar que um servidor de banco de dados execute uma atualização e retorne a resposta.
Você não pode usar loops de controle básicos com funções dentro deles que executam de forma assíncrona. Em vez disso, você precisa de algo que possa chamar a próxima iteração do loop (ou pelo menos sinalizar que uma única iteração está completa) uma vez que a função assíncrona "update" realmente retornou um resultado.
O segundo ponto aqui é que "nada atualizado" porque você não disse à função o que atualizar ou com o que atualizar o documento correspondente.
O seguinte é análogo à sua listagem original do PHP, mas ajustado para métodos "assíncronos" também use o
async.eachSeries
para o controle de loop do 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
}
);
O
.findOneAndUpdate()
Em vez disso, o comando retorna o documento que foi modificado e com as modificações somente se você as solicitar com { "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 você quiser adicionar vários elementos de array de uma só vez, ou se tiver um único elemento diretamente em um array, use o
$each
modificador para $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
}
);