In MongoDB, I have a movie collection that has an array of languages , e.g.
languages: [0:USA, 1: German, 2: French, ...etc]
The array values are no
Use the positional $ operator which identifies the element in the languages
array to update without explicitly specifying its position in the array i.e. instead of knowing the position in advance and updating the element as:
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.2": "Francais" } }
)
you can just use the $ operator as:
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.$": "Francais" } }
)
In case you have duplicate entries in your array like this:
"languages" : [
"USA",
"German",
"Francais",
"Francais"
]
You can use the following syntax to replace all occurrences starting with MongoDB v3.5.12 (documentation)
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.$[filter]": "Francais" } },
{ "arrayFilters": [ { "filter": "French" } ] }
)
Strictly speaking, the { "languages": "French" }
filter is not needed. It will, however, speed up things by leveraging an index on "languages" in case there is one. If that's not needed/wanted, passing a simple {}
value as the first parameter works as well.