MongoDBで配列内の特定の要素を更新する方法
MongoDBで配列の特定要素を更新するには
MongoDBでは、更新操作時に位置指定演算子($)を使用することで、条件に一致した配列要素の中から「正確な位置」にある要素だけをピンポイントで更新できます。ネストされた配列ドキュメントの特定の値を書き換えたい場合にとても便利な機能です。
基本構文
{"yourArrayDocumentName.$.yourNestedArrayDocument.yourPosition":"yourValue"}});
「$」は、クエリ条件に一致した配列要素の位置を自動的に表すプレースホルダーです。この構文の動作を理解するために、実際にコレクションを作成して確認していきましょう。
サンプルコレクションの作成
まず、俳優情報を格納したドキュメントを含むコレクションを作成します。以下のクエリを実行してください。
> db.updateExactField.insertOne({"ActorId":1,"ActorDetails":[{"ActorName":"Johnny Depp","MovieList":
["The Tourist","Public Enemy"]},
... {"ActorName":"Chris Evans","MovieList":["Captain America","Avengers"]}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d7f63f2db199c1278e7f1")
}
登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のドキュメントを表示できます。クエリは次のとおりです。
> db.updateExactField.find().pretty();
実行結果は以下のようになります。
{
"_id" : ObjectId("5c6d7f63f2db199c1278e7f1"),
"ActorId" : 1,
"ActorDetails" : [
{
"ActorName" : "Johnny Depp",
"MovieList" : [
"The Tourist",
"Public Enemy"
]
},
{
"ActorName" : "Chris Evans",
"MovieList" : [
"Captain America",
"Avengers"
]
}
]
}
ケース1: インデックス2(3番目)の要素を更新する
配列のインデックスは0から始まるため、「3番目」の要素はインデックス2に相当します。ここでは、Chris EvansのMovieListの3番目の要素を「Avengers:Infinity War」に更新します。クエリは以下のとおりです。
> db.updateExactField.update(
... {"ActorDetails.ActorName":"Chris Evans"},
... {$set:
... {"ActorDetails.$.MovieList.2":"Avengers:Infinity War"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
find()メソッドで再度ドキュメントを表示し、結果を確認してみましょう。
> db.updateExactField.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c6d7f63f2db199c1278e7f1"),
"ActorId" : 1,
"ActorDetails" : [
{
"ActorName" : "Johnny Depp",
"MovieList" : [
"The Tourist",
"Public Enemy"
]
},
{
"ActorName" : "Chris Evans",
"MovieList" : [
"Captain America",
"Avengers",
"Avengers:Infinity War"
]
}
]
}
上記の出力を見ると、3番目の位置(インデックス2)に「Avengers:Infinity War」が正しく設定されていることがわかります。
ケース2: インデックス1(2番目)の要素を更新する
次に、2番目の位置(インデックス1)の要素を「Gifted」に更新してみます。クエリは以下のとおりです。
> db.updateExactField.update( {"ActorDetails.ActorName":"Chris Evans"}, {$set:
{"ActorDetails.$.MovieList.1":"Gifted"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
find()メソッドでドキュメントを確認しましょう。
> db.updateExactField.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c6d7f63f2db199c1278e7f1"),
"ActorId" : 1,
"ActorDetails" : [
{
"ActorName" : "Johnny Depp",
"MovieList" : [
"The Tourist",
"Public Enemy"
]
},
{
"ActorName" : "Chris Evans",
"MovieList" : [
"Captain America",
"Gifted",
"Avengers:Infinity War"
]
}
]
}
上記の出力例を見ると、2番目の位置(インデックス1)に「Gifted」が正しく反映されていることが確認できます。
まとめと補足
このように、位置指定演算子($)と$setを組み合わせることで、MongoDBの配列内にある任意の位置の要素を正確に更新できます。なお、update()メソッドは現在非推奨のため、最新のMongoDBではupdateOne()やupdateMany()の使用が推奨されています。また、配列の末尾へ要素を追加したい場合は$push演算子を、条件に一致する複数の配列要素を一括更新したい場合はarrayFiltersオプションを活用すると、より柔軟な配列操作が可能になります。
-
MongoDBで配列内の要素を更新する方法|$setと位置演算子$の使い方を解説
MongoDBで配列内の要素を更新する基本 MongoDBでドキュメント内の配列の要素を更新するには、update()メソッドに $set 演算子と位置演算子「$」を組み合わせて使用します。この組み合わせにより、クエリ条件に一致した配列要素だけをピンポイントで書き換えることができます。 ステップ1:コレクションの作成とドキュメントの挿入 まず、insertOne() メソッドを使ってサンプルデータを登録します。ここでは、大学名(CollegeName)と学費(Fees)を含む「CollegeDetails」という配列を持つドキュメントを1件作成しました。 > db.demo494.in
-
MongoDBで配列の要素を削除するには?$pull演算子の使い方を解説
MongoDBで配列から要素を削除する基本MongoDBで配列内の要素を削除したい場合は、$pull演算子を使用します。$pullは、既存の配列から指定した値、または条件に一致するすべてのインスタンスを取り除くための更新演算子です。この記事では、実際にコレクションを作成し、ネストされた配列から特定の要素を削除する手順を順番に解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは「software」フィールドの中に「services」という配列を持つドキュメントを挿入します。db.demo541.insertOne({software:{servic