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.
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>, ... },
...
}
où <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)
où
err
est l'erreur le cas échéantraw
est la réponse complète de MongoPuisque 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
.
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) {
//
});
Cela aidera, je suppose
Employeehierarchy.findOneAndUpdate(
{ _id:employeeparent._id },
{ $set: { "childrens": employee._id }}
)