MongoDBには、さまざまな言語の映画コレクションがあります。languages: [0:USA, 1: German, 2: French, ...etc]
配列の値は特定の順序ではありません。
特定の値に基づいて配列値を更新するにはどうすればよいですか?コレクション全体について、すべての "French"を更新して "Francais"に置き換えたいとしましょう。どうやってやるの?
positional $
operator は、配列内の位置を明示的に指定せずに、更新するlanguages
配列の要素を識別します。つまり、事前に位置を認識して要素を次のように更新するのではありません。
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.2": "Francais" } }
)
$
演算子として:
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.$": "Francais" } }
)
次のように配列に重複したエントリがある場合:
"languages" : [
"USA",
"German",
"Francais",
"Francais"
]
次の構文を使用してMongoDB v3.5.12以降のすべてのオカレンスを置き換えることができます( documentation )
db.movies.updateMany(
{ "languages": "French" },
{ "$set": { "languages.$[filter]": "Francais" } },
{ "arrayFilters": [ { "filter": "French" } ] }
)
厳密に言えば、{ "languages": "French" }
フィルターは必要ありません。ただし、「言語」のインデックスがある場合はそれを活用することで、処理速度が向上します。それが不要/必要な場合は、単純な{}
最初のパラメータとしての値も機能します。