MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Inserisci matrice nel documento esistente

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