web-dev-qa-db-fra.com

Mongoose, met à jour les valeurs dans un tableau d'objets

Est-il possible de mettre à jour des valeurs dans 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 les éléments de nom et de valeur pour l'élément où id = 2;

J'ai essayé ce qui suit w/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’il met à jour/définit tout l’objet, donc dans ce cas je perds le champ id.

Y a-t-il un meilleur moyen dans la mangouste de définir certaines valeurs dans un tableau tout en laissant les autres valeurs seules?

J'ai aussi demandé seulement à la 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().
});
70
lostintranslation

Vous êtes proches; vous devriez utiliser la notation par points dans votre utilisation du $ opérateur de mise à jour pour le faire:

Person.update({'items.id': 2}, {'$set': {
    'items.$.name': 'updated item2',
    'items.$.value': 'two updated'
}}, function(err) { ...
119
JohnnyHK
model.update({"_id": 1, "items.id": "2"}, 
{$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})

document Mongodb

10
Howard

Pour chaque document, l'opérateur de mise à jour $set can définir plusieurs valeurs , donc plutôt que de remplacer l’objet entier dans le tableau items, vous pouvez définir les champs name et value de l'objet individuellement.

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

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

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

Il y a une chose à retenir, lorsque vous recherchez un objet dans un tableau sur la base de plusieurs conditions, utilisez $ elemMatch

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

voici les docs

0
Gopal Sharma
update(
    {_id: 1, 'items.id': 2},
    {'$set': {'items.$[]': update}},
    {new: true})

Voici la doc sur $ [] .

0
Chaitanya Adesara

En mangouste on peut mettre à jour, comme un simple tableau

user.updateInfoByIndex(0,"test")

User.methods.updateInfoByIndex = function(index, info) ={
    this.arrayField[index]=info
    this.save()
}
0
Vilintritenmert

Il y a une manière mangeuse de 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')
});
0
Anees Hameed