MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Insérer un tableau dans un document existant

Il y a quelques choses qui ne vont pas dans votre code ici. Tout d'abord, notez que vous travaillez maintenant dans un environnement "asynchrone" et que vous devez changer votre façon de penser sur certaines choses.

Votre code PHP précédent est "bloquant", ce qui signifie que chaque ligne de code doit se terminer avant de passer à la ligne de code suivante. Cela inclut l'attente qu'un serveur de base de données effectue une mise à jour et renvoie la réponse.

Vous ne pouvez pas utiliser des boucles de contrôle de base avec des fonctions à l'intérieur qui s'exécutent de manière asynchrone. Au lieu de cela, vous avez besoin de quelque chose qui peut appeler la prochaine itération de la boucle (ou au moins signaler qu'une seule itération est terminée) une fois que la fonction asynchrone "update" a effectivement renvoyé un résultat.

Le deuxième point ici est que "rien n'a été mis à jour" parce que vous n'avez pas dit à la fonction quoi mettre à jour ou avec quoi mettre à jour le document correspondant.

Ce qui suit est analogue à votre liste PHP d'origine, mais ajustée pour les méthodes "async", utilisez également le async.eachSeries pour le contrôle de boucle depuis le async bibliothèque :

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

Le .findOneAndUpdate() commande renvoie à la place le document qui a été modifié et avec les modifications uniquement si vous les demandez avec { "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 vous souhaitez ajouter plusieurs éléments de tableau à la fois, ou si vous avez même un seul élément directement dans un tableau, utilisez le $each modificateur de $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
    }
);