139 votes

Mongoose, mise à jour des valeurs dans un tableau d'objets

Existe-t-il un moyen de mettre à jour les valeurs d'un objet ?

{
  _id: 1,
  name: 'John Smith',
  items: [{
     id: 1,
     name: 'item 1',
     value: 'one'
  },{
     id: 2,
     name: 'item 2',
     value: 'two'
  }]
}

Disons que je veux mettre à jour le nom et la valeur des éléments pour l'élément où id = 2 ;

J'ai essayé ce qui suit avec la mangouste :

var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set':  {'items.$': update}}, function(err) { ...

Le problème avec cette approche est qu'elle met à jour/réinitialise l'objet entier, donc dans ce cas je perds le champ id.

Existe-t-il un meilleur moyen dans Mongoose pour définir certaines valeurs dans un tableau tout en laissant les autres valeurs intactes ?

J'ai également fait une demande pour la seule personne :

Person.find({...}, function(err, person) {
  person.items ..... // I might be able to search through all the items here and find item with id 2 then update the values I want and call person.save().
});

5voto

Vous trouverez ci-dessous un exemple de mise à jour plus dynamique de la valeur du tableau d'objets.

Person.findOneAndUpdate({_id: id}, 
{ 
  "$set": {[`items.$[outer].${propertyName}`]: value} 
},
{ 
  "arrayFilters": [{ "outer.id": itemId }]
},
function(err, response) {
  ...
})

Notez qu'en procédant de cette manière, vous serez en mesure de mettre à jour des niveaux encore plus profonds du tableau imbriqué en ajoutant des fichiers arrayFilters et opérateur positionnel comme ceci :

"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value} 

"arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]

Vous trouverez plus d'informations sur l'utilisation de ce service dans le documents officiels .

1voto

samehanwar Points 937

Solution de nettoyage en utilisant findOneAndUpdate

  await Person.findOneAndUpdate(
    { _id: id, 'items.id': 2 },
    {
      $set: {
        'items.$.name': 'updated item2', 
        'items.$.value': 'two updated',
      }
    },
   );

0voto

KARTHIKEYAN.A Points 4408

Dans Mongoose, nous pouvons mettre à jour la valeur d'un tableau en utilisant $set à l'intérieur du point ( . ) à une valeur spécifique de la manière suivante

db.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})

0voto

Maduekwe Pedro Points 1625

J'ai essayé d'autres solutions qui ont bien fonctionné, mais l'écueil de leurs réponses est que seuls les champs déjà existants seraient mis à jour ; l'ajout d'un upsert ne ferait rien, alors j'ai trouvé ceci.

 Person.update({'items.id': 2}, {$set: {
    'items': { "item1",  "item2",  "item3",  "item4" } }, {upsert: 
true })

0voto

Taban Cosmos Points 338

J'ai eu des problèmes similaires. Voici la façon la plus propre de le faire.

    const personQuery = {
       _id: 1  
    }

    const itemID = 2;

    Person.findOne(personQuery).then(item => {
       const audioIndex = item.items.map(item => item.id).indexOf(itemID);
       item.items[audioIndex].name = 'Name value';
       item.save();
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X