MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Inserir matriz em documento existente


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
    }
);