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

0voto

Cuado Points 78

J'ai trouvé cette solution en utilisant dot-object et elle m'a aidé.

import dot from "dot-object";

const user = await User.findByIdAndUpdate(id, { ...dot.dot(req.body) });

0voto

heavy-matill Points 1

J'avais besoin de mettre à jour un élément de tableau avec des paires clé-valeur dynamiques. Par cartographie l'objet de mise à jour vers de nouvelles clés contenant les $ l'opérateur de mise à jour, je ne suis plus obligé de connaître les clés mises à jour de l'élément du tableau et je peux assembler un nouvel objet de mise à jour à la volée.

update = {
  name: "Andy",
  newKey: "new value"
}
new_update = Object.fromEntries(
  Object.entries(update).map(
    ([k, v], i) => ["my_array.$." + k, v]
  )
)
console.log({
  "$set": new_update
})

-1voto

Vilintritenmert Points 82

Dans Mongoose, nous pouvons mettre à jour, comme un simple tableau.

user.updateInfoByIndex(0,"test")

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

-1voto

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

Voici le document sur $[] : https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up. S []

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