MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順
MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。
> db.demo595.insertOne( { "Information": [
{ "_id": new ObjectId(), Name:"Chris" },
{ _id:new ObjectId(), Name:"Robert" }
] } );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e93369cfd2d90c177b5bce4")
}
2. 作成したドキュメントの確認
find()メソッドとpretty()メソッドを組み合わせることで、コレクション内のすべてのドキュメントを見やすい形式で表示できます。
> db.demo595.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e93369cfd2d90c177b5bce4"),
"Information" : [
{
"_id" : ObjectId("5e93369cfd2d90c177b5bce2"),
"Name" : "Chris"
},
{
"_id" : ObjectId("5e93369cfd2d90c177b5bce3"),
"Name" : "Robert"
}
]
}
3. ネストされたドキュメントを更新するクエリ
続いて、配列内の特定のサブドキュメントを更新します。ポイントは、クエリ条件で対象のサブドキュメントの_idを指定し、更新側では位置演算子「$」を使って「マッチした配列要素」を参照することです。
> db.demo595.update({"Information._id":ObjectId("5e93369cfd2d90c177b5bce2")},
{$set:{"Information.$.Name":"David Miller"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このクエリでは、「Information」配列の中から_idが「5e93369cfd2d90c177b5bce2」である要素を検索し、その要素の「Name」フィールドを「David Miller」に更新しています。WriteResultの「nModified: 1」は、1件のドキュメントが正常に更新されたことを示しています。
4. 更新後のドキュメントを確認
再度find()メソッドを実行して、更新が正しく反映されているか確認しましょう。
> db.demo595.find().pretty();
実行すると、次のように「Chris」が「David Miller」に変更されていることがわかります。
{
"_id" : ObjectId("5e93369cfd2d90c177b5bce4"),
"Information" : [
{
"_id" : ObjectId("5e93369cfd2d90c177b5bce2"),
"Name" : "David Miller"
},
{
"_id" : ObjectId("5e93369cfd2d90c177b5bce3"),
"Name" : "Robert"
}
]
}
まとめ
ネストされたドキュメント(配列内のサブドキュメント)を更新する際は、次の手順が基本となります。
- クエリ条件: 「フィールド名._id」のようにドット表記で、更新したい配列内の要素を特定します。
- 位置演算子 $: 更新側では「Information.$.Name」のように「$」を指定することで、クエリにマッチした配列要素だけをピンポイントで更新できます。
- $set 演算子: 既存のフィールド値を上書きするために使用します。
なお、MongoDBの最新バージョンではupdate()メソッドの代わりにupdateOne()やupdateMany()の使用が推奨されています。これらのメソッドでも同じ構文でネストされたドキュメントを更新できるため、用途に応じて使い分けるとよいでしょう。
-
MongoDBのfind()クエリでネストされたドキュメントを取得する方法
MongoDBでネストされたドキュメント(入れ子になったサブドキュメントや配列内のオブジェクト)から値を取得するには、「ドット表記(dot notation)」を使用します。この記事では、サンプルコレクションを作成し、find()クエリを使ってネストされたデータを検索する具体的な手順を解説します。 サンプルコレクションの作成 まず、insert()メソッドを使ってドキュメントを含むコレクションを作成しましょう。 > db.demo591.insert([ ... { "Name": "John", "Age": 23 },
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...