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

Comment mettre à jour une valeur de tableau dans Mongoose

Vous ne pouvez pas utiliser à la fois $set et $push dans la même expression de mise à jour que les opérateurs imbriqués.

La syntaxe correcte pour l'utilisation des opérateurs de mise à jour est la suivante :

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

<operator1>, <operator2> peut provenir de n'importe quelle liste d'opérateurs de mise à jour spécifiée ici.

Pour ajouter un nouvel élément au tableau, un seul $push l'opérateur suffira, par ex. vous pouvez utiliser le findByIdAndUpdate méthode de mise à jour pour renvoyer le document modifié sous

Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { "$push": { "childrens": employee._id } },
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);

Utilisation de votre update() d'origine méthode, la syntaxe est

Employeehierarchy.update(
   { "_id": employeeparent._id},
   { "$push": { "childrens": employee._id } },
   function (err, raw) {
       if (err) return handleError(err);
       console.log('The raw response from Mongo was ', raw);
   }
);

dans laquelle la fonction callback reçoit les arguments (err, raw)

  • err est l'erreur, le cas échéant
  • raw est la réponse complète de Mongo

Puisque vous voulez vérifier le document modifié, je vous suggère d'utiliser le findByIdAndUpdate fonction depuis la update() La méthode ne vous donnera pas le document modifié, juste le résultat d'écriture complet de mongo.

Si vous souhaitez mettre à jour un champ dans le document et ajouter un élément à un tableau en même temps, vous pouvez le faire

Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { 
        "$set": { "name": "foo" },
        "$push": { "childrens": employee._id } 
    } 
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);

Ce qui précède mettra à jour le name champ à "foo" et ajoutez l'identifiant de l'employé au childrens tableau.