web-dev-qa-db-fra.com

MongoDB Remplacer des valeurs de tableau spécifiques

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?

13
user2883596

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" } }
)
14
chridam

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.

2
dnickless