Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

$[]

項目一覧

  • 定義
  • 動作
$[]

全位置演算子$[] は、指定された配列フィールドのすべての要素を更新演算子によって変更する必要があることを示します。

$[]演算子は次のような形をとります。

{ <update operator>: { "<array>.$[]" : value } }

更新操作で使用します。 db.collection.updateOne()およびdb.collection.findAndModify()は、クエリ条件に一致するドキュメントのすべての配列要素を変更します。例えば:

db.collection.updateOne(
{ <query conditions> },
{ <update operator>: { "<array>.$[]" : value } }
)

例については、「 配列内のすべての要素の更新」を参照してください。

MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。

アップサート操作の結果が挿入になる場合、更新ステートメントで$[]位置演算子を使用するには、 queryに配列フィールドの完全な等価一致が含まれている必要があります。

例えば、次のアップサート操作では、更新ドキュメントで $[] を使用し、配列フィールドに完全等価一致の条件を指定します。

db.collection.updateOne(
{ myArray: [ 5, 8 ] },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)

該当するドキュメントが存在しない場合は、この操作によって次のドキュメントが挿入されます。

{ "_id" : ObjectId(...), "myArray" : [ 10, 10 ] }

アップサート操作に完全な等価一致が含まれず、アップデートする一致するドキュメントが見つからない場合、アップサート操作はエラーになります。

たとえば、アップデートする一致するドキュメントが見つからない場合、次の操作はエラーになります。

db.emptyCollection.updateOne(
{ },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)
db.emptyCollection.updateOne(
{ myArray: 5 },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)

$[]演算子は、複数の配列やネストされた配列を走査するクエリに使用できます。

例については、「 $[<identifier>]を使用した入れ子配列のアップデート 」を参照してください。

students コレクションを次のように作成します。

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 85, 82, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

コレクション内のすべてのドキュメントのgrades配列内のすべての要素を10ずつ増やすには、全位置演算子$[]を使用します。

db.students.updateMany(
{ },
{ $inc: { "grades.$[]": 10 } },
)

全位置演算子$[]は、配列フィールド内のすべての要素のプレースホルダーとして機能します。

操作後、students コレクションには次のドキュメントが含まれます。

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }

$[] 位置演算子は、埋め込みドキュメントを含む配列のアップデートを容易にします。埋め込みドキュメントのフィールドにアクセスするには、$[] 演算子を使用したドット表記を使用します。

db.collection.updateOne(
{ <query selector> },
{ <update operator>: { "array.$[].field" : value } }
)

students2 コレクションを次のように作成します。

db.students2.insertMany( [
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 8 },
{ "grade" : 85, "mean" : 90, "std" : 6 },
{ "grade" : 85, "mean" : 85, "std" : 8 }
]
},
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 8 },
{ "grade" : 87, "mean" : 90, "std" : 5 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
}
] )

grades配列内のすべての要素のstdフィールドの値を変更するには、位置オペレーター$[]を使用します。

db.students2.updateMany(
{ },
{ $inc: { "grades.$[].std" : -2 } },
)

操作後、コレクションには次のドキュメントが含まれます。

{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 90, "std" : 4 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
}
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 6 },
{ "grade" : 87, "mean" : 90, "std" : 3 },
{ "grade" : 85, "mean" : 85, "std" : 4 }
]
}

results コレクションを次のように作成します。

db.results.insertMany( [
{ "_id" : 1, "grades" : [ 85, 82, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

grades配列内の値100を持つドキュメントを除くすべてのドキュメントのgrades配列内のすべての要素を10増分するには、すべての位置演算子$[]を使用します。

db.results.updateMany(
{ "grades" : { $ne: 100 } },
{ $inc: { "grades.$[]": 10 } },
)

全位置演算子$[]は、配列フィールド内のすべての要素のプレースホルダーとして機能します。

操作後、students コレクションには次のドキュメントが含まれます。

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

$[] 演算子をフィルター $[<identifier>] 位置演算子と組み合わせて使用すると、ネストされた配列を更新できます。

次のドキュメントを使用してコレクション students3 を作成します。

db.students3.insertMany( [
{ "_id" : 1,
"grades" : [
{ type: "quiz", questions: [ 10, 8, 5 ] },
{ type: "quiz", questions: [ 8, 9, 6 ] },
{ type: "hw", questions: [ 5, 4, 3 ] },
{ type: "exam", questions: [ 25, 10, 23, 0 ] },
]
}
] )

typeに関係なく、ネストされたgrades.questions配列内で8以上のすべての値をアップデートするには、

db.students3.updateMany(
{},
{ $inc: { "grades.$[].questions.$[score]": 2 } },
{ arrayFilters: [ { "score": { $gte: 8 } } ] }
)

アップデートされたドキュメントは、次のようになります。

{
_id: 1,
grades: [
{ type: 'quiz', questions: [ 12, 10, 5 ] },
{ type: 'quiz', questions: [ 10, 11, 6 ] },
{ type: 'hw', questions: [ 5, 4, 3 ] },
{ type: 'exam', questions: [ 27, 12, 25, 0 ] }
]
}

Tip

以下も参照してください。

戻る

$ (update)

項目一覧