web-dev-qa-db-fra.com

Comment mettre à jour une valeur de tableau dans Mongoose

Je veux mettre à jour une valeur de tableau mais je ne suis pas sûr de la bonne méthode pour le faire, donc j'ai essayé de suivre la méthode mais cela n'a pas fonctionné pour moi.

Mon modèle, Le champ des enfants dans mon modèle

   childrens: {
       type: Array,
       default: ''
  }

Ma requête,

   Employeehierarchy.update({ _id: employeeparent._id} ,{ $set: {"$Push": { "childrens": employee._id }} })
   .exec(function (err, managerparent) {});

Quelqu'un peut-il me fournir de l'aide, merci.

7
MMR

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

La syntaxe correcte pour utiliser les 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 opérateur $Push suffit par exemple vous pouvez utiliser la méthode de mise à jour findByIdAndUpdate pour renvoyer le document modifié comme

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

En utilisant votre méthode originale update(), 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 lequel la fonction de rappel 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 la fonction findByIdAndUpdate depuis le 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 champ name en "foo" et ajoutera l'ID d'employé au tableau childrens.

18
chridam

peut suivre cela

si childrens contient des valeurs de chaîne, le modèle peut ressembler à:

childrens: [{
    type : String
}]

si childrens contient les valeurs ObjectId d'une autre collection _id et que vous souhaitez remplir, le modèle peut ressembler à:

childrens: [{
    type : mongoose.Schema.Types.ObjectId,
    ref: 'refModelName'
}]

pas besoin d'utiliser $set utilisez simplement $Push pour insérer une valeur dans le tableau childrens. donc la requête peut être comme:

Employeehierarchy.update(
   { _id: employeeparent._id},
   {"$Push": { "childrens": employee._id } }
 ).exec(function (err, managerparent) {
    //
 });
2
Shaishab Roy

Cela aidera, je suppose

Employeehierarchy.findOneAndUpdate(
  { _id:employeeparent._id },
  { $set: { "childrens": employee._id }}
)
1
Deeksha Sharma