$[identifier] (条件付き位置演算子)
最終更新:2026-10-09
$[identifier] (条件付き位置演算子)
$[identifier] は、arrayFilters と組み合わせて、条件に一致する配列要素だけを更新する位置演算子です。`{ $set: { 'grades.$[elem]': 90 } }, { arrayFilters: [{ 'elem.grade': { $gte: 85 } }] }` のように使います。MongoDB 3.6 で導入された最も柔軟な配列更新で、識別子は arrayFilters で定義し、ネストしたドキュメントのフィールドにも一致させられます。
| カテゴリ | 更新修飾子 |
|---|---|
| MongoDB バージョン | 3.6+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ <update operator>: { '<array field>.$[<identifier>]': <value> } }, { arrayFilters: [ { '<identifier>.<field>': <condition> } ] }
⚙️ パラメータ
| 配列フィールド | 更新する配列フィールド。 |
|---|---|
| 識別子 | arrayFilters で定義されるプレースホルダー(例: elem)。 |
| arrayFilters | 識別子の一致規則を定義する条件配列。 |
戻り値:更新結果
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $[elem]: 85 以上のグレードだけを更新
// arrayFilters で elem のルールを定義
db.students.updateOne(
{ _id: 1 },
{ $set: { 'grades.$[elem]': 100 } },
{ arrayFilters: [{ 'elem': { $gte: 85 } }] }
)
出力:
// 85 以上のグレードだけが 100 になり、それ以外は変更されない
📌 注意事項
- arrayFilters 内の識別子には $ プレフィックスを付けない
- ネストしたドキュメントや複数フィールドの条件に対応
- 同じ更新パスで $ や $[] とは併用できない
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q$[elem] と $[] の違いは?
A$[] はすべての要素を更新します。$[elem] は arrayFilters で条件に一致する要素だけを更新します。
QarrayFilters はどう書きますか?
A{ arrayFilters: [{ 'elem': { $gte: 85 } }] } のように書きます。識別子には $ プレフィックスを付けません。
Qネストしたフィールドでフィルターできますか?
Aはい。たとえば { 'elem.type': 'exam' } のように指定できます。