sql >> Base de Datos >  >> NoSQL >> MongoDB

Insertar matriz en documento existente

Hay algunas cosas mal en su código aquí. Lo primero y más importante a tener en cuenta es que ahora se está ejecutando en un entorno "asincrónico" y necesita cambiar la forma de pensar sobre cómo hace algunas cosas.

Su código PHP anterior está "bloqueando", lo que significa que cada línea de código debe completarse antes de pasar a la siguiente línea de código. Esto incluye esperar a que un servidor de base de datos realice una actualización y devuelva la respuesta.

No puede usar bucles de control básicos con funciones dentro de ellos que funcionan de forma asíncrona. En su lugar, necesita algo que pueda llamar a la próxima iteración del ciclo (o al menos indicar que se completó una única iteración) una vez que la función asíncrona "actualizar" haya devuelto un resultado.

El segundo punto aquí es que "no se actualizó nada" porque no le dijo a la función qué actualizar o con qué actualizar el documento coincidente.

Lo siguiente es análogo a su lista PHP original, pero ajustado para los métodos "asincrónicos" también use el async.eachSeries para el control de bucle desde 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
    }
);

El .findOneAndUpdate() en cambio, el comando devuelve el documento que se modificó y con las modificaciones solo si las solicita 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
    }
);

Si desea agregar varios elementos de matriz a la vez, o si tiene incluso un solo elemento directamente en una matriz, use $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
    }
);