Dans MongoDB, j'ai une collection de films qui a un éventail de langues, par exemple.languages: [0:USA, 1: German, 2: French, ...etc]
Les valeurs du tableau ne sont pas dans un ordre particulier.
Comment puis-je maintenant mettre à jour une valeur de tableau en fonction d'une valeur spécifique? Disons que je veux mettre à jour tous les "français" et les remplacer par "français" pour toute la collection. Comment puis je faire ça?
Utilisez le positionnel $
operator qui identifie l'élément dans le tableau languages
à mettre à jour sans spécifier explicitement sa position dans le tableau, c'est-à-dire au lieu de connaître la position à l'avance et de mettre à jour l'élément comme:
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.2": "Francais" } }
)
vous pouvez simplement utiliser le $
opérateur comme:
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.$": "Francais" } }
)
Si vous avez des entrées en double dans votre tableau comme ceci:
"languages" : [
"USA",
"German",
"Francais",
"Francais"
]
Vous pouvez utiliser la syntaxe suivante pour remplacer toutes les occurrences commençant par MongoDB v3.5.12 ( documentation )
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.$[filter]": "Francais" } },
{ "arrayFilters": [ { "filter": "French" } ] }
)
À proprement parler, le { "languages": "French" }
le filtre n'est pas nécessaire. Il accélérera cependant les choses en exploitant un index sur les "langues" au cas où il y en aurait un. Si ce n'est pas nécessaire/voulu, en passant un simple {}
value car le premier paramètre fonctionne également.