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

223voto

JohnnyHK Points 61191

Vous n'êtes pas loin ; vous devriez utiliser la notation par points dans votre utilisation de la fonction $ opérateur de mise à jour pour le faire :

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

45voto

Howard Points 561
model.update(
    { _id: 1, "items.id": "2" },
    {
        $set: {
            "items.$.name": "yourValue",
            "items.$.value": "yourvalue",
         }
    }
)

Document MongoDB

23voto

Anees Hameed Points 161

Il existe une méthode de la mangouste pour le faire.

const itemId = 2;
const query = {
  item._id: itemId 
};
Person.findOne(query).then(doc => {
  item = doc.items.id(itemId );
  item["name"] = "new name";
  item["value"] = "new value";
  doc.save();

  //sent respnse to client
}).catch(err => {
  console.log('Oh! Dark')
});

11voto

Gopal Sharma Points 86

Il y a une chose à retenir, lorsque vous recherchez l'objet dans le tableau sur la base de plus d'une condition, alors utilisez $elemMatch

Person.update(
   {
     _id: 5,
     grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
   },
   { $set: { "grades.$.std" : 6 } }
)

voici le docs

6voto

Shaun Points 264

Pour chaque document, l'opérateur de mise à jour $set puede définir plusieurs valeurs Ainsi, plutôt que de remplacer l'ensemble de l'objet dans la section items vous pouvez définir l'élément name et value les champs de l'objet individuellement.

{'$set':  {'items.$.name': update.name , 'items.$.value': update.value}}

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