web-dev-qa-db-ja.com

MongoDB特定の配列値を置き換える

MongoDBには、さまざまな言語の映画コレクションがあります。
languages: [0:USA, 1: German, 2: French, ...etc]

配列の値は特定の順序ではありません。

特定の値に基づいて配列値を更新するにはどうすればよいですか?コレクション全体について、すべての "French"を更新して "Francais"に置き換えたいとしましょう。どうやってやるの?

13
user2883596

positional $ operator は、配列内の位置を明示的に指定せずに、更新するlanguages配列の要素を識別します。つまり、事前に位置を認識して要素を次のように更新するのではありません。

db.movies.updateMany(
    { "languages": "French" }, 
    { "$set": { "languages.2": "Francais" } }
)

$ 演算子として:

db.movies.updateMany(
    { "languages": "French" }, 
    { "$set": { "languages.$": "Francais" } }
)
14
chridam

次のように配列に重複したエントリがある場合:

"languages" : [ 
    "USA", 
    "German", 
    "Francais",
    "Francais"
]

次の構文を使用してMongoDB v3.5.12以降のすべてのオカレンスを置き換えることができます( documentation

db.movies.updateMany(
    { "languages": "French" },
    { "$set": { "languages.$[filter]": "Francais" } },
    { "arrayFilters": [ { "filter": "French" } ] }
)

厳密に言えば、{ "languages": "French" }フィルターは必要ありません。ただし、「言語」のインデックスがある場合はそれを活用することで、処理速度が向上します。それが不要/必要な場合は、単純な{}最初のパラメータとしての値も機能します。

2
dnickless