2
votes

Remplacer une valeur de champ de tableau

Considérez les données mongo suivantes:

substituteItemOnArray = (id, from, to) => {
   MyModel.update({
      id: id
   },
   {
      ??? What is the correct way to substitute one element with another ???
   });

}

substituteItemOnArray("1", "Peter", "Sarah");

Quelle est la manière correcte de remplacer un élément simple dans le tableau, pour obtenir le résultat suivant?

{ _id: "1",
  names: ["John", "Sarah"]
}


5 commentaires

names est-il un tableau de chaînes? quelque chose comme noms: ["John", "Peter"] . Je pense que les données sont également un type de tableau


Oui! Je vais corriger dans le code ...


docs.mongodb.com/manual/reference / opérateur / mise à jour /…


Copie possible de Comment mettre à jour plusieurs éléments de tableau dans mongodb


Double possible de MongoDB Remplacer les valeurs de tableau spécifiques


3 Réponses :


1
votes

Je ne connais aucun moyen de le faire avec uniquement des opérateurs Mongo.

Je pense que vous devrez récupérer le document par id, trouver l'index de la chaîne que vous souhaitez remplacer et seulement après cette mise à jour du document

La fonction ci-dessous devrait faire ce que j'ai décrit ci-dessus

async substituteItemOnArray = (_id, from, to) => {
    const doc = await MyModel.findOne({  _id  });
    if (doc && doc.names && doc.names.indexOf(from) > -1) {

    const index = dox.names.indexOf(from); 
    const keyToUpdate = `names.${index}`;
    MyModel.update({ _id }, { $set: { [keyToUpdate] : to} },)
}

substituteItemOnArray("1", "Peter", "Sarah");


0 commentaires

1
votes

Vous pouvez le faire avec les arrayFilters mongoDB comme celui-ci dans mongoose:

function substituteItemOnArray = (id, from, to) {
  return MyModel.findOneAndUpdate(
    {id: id}, // where to update
    {$set: {'names.$[element]': to }}, // what to update
    {arrayFilters: [{'element': from}]} // what should match in array.
  )
}

(
  async () => {
    let doc = await substituteItemOnArray(id, "Peter", "Sarah");
    console.log(doc);
  }
)()


0 commentaires

1
votes

Utilisez simplement l'opérateur de position $

db.getCollection('test').findOneAndUpdate(
  { names: "Peter" },
  { $set: { 'names.$': "Sarah" }}
)


2 commentaires

Est-ce que ça va marcher, peu importe les positions de "Sarah" sur le tableau? ["John", "Sarah"], ["Sarah", "John"], ["John", "Sarah", "Peter"] , etc.


Oui, vous pouvez vérifier