MongoDBでネストされた埋め込みドキュメントを更新する方法
MongoDBでネストされた埋め込みドキュメント(サブドキュメント)を更新するには、update()メソッドと位置演算子($)を使用します。位置演算子「$」は、クエリ条件に一致した配列要素を自動的に識別し、その要素だけを対象に更新処理を行える便利な機能です。
コレクションの作成とドキュメントの挿入
まず、insertOne()メソッドを使って、ネストされた構造を持つドキュメントを含むコレクションを作成しましょう。
> db.demo643.insertOne({
... details : [
... {
... "CountryName":"US",
... StudentDetails:[{Name:"Chris"},{SubjectName:"MySQL"}]
... },
...
... {
... "CountryName":"UK",
... StudentDetails:[{Name:"Bob"},{SubjectName:"Java"}]
... }
... ]
... }
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c737f6c954c74be91e6e3")
}find()メソッドでドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo643.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e9c737f6c954c74be91e6e3"), "details" : [ { "CountryName" : "US", "StudentDetails" : [ { "Name" : "Chris" }, { "SubjectName" : "MySQL" } ] }, { "CountryName" : "UK", "StudentDetails" : [ { "Name" : "Bob" }, { "SubjectName" : "Java" } ] } ] }ネストされた埋め込みドキュメントの更新クエリ
ここからが本題です。以下のクエリでは、$push演算子と位置演算子$を組み合わせて、条件に一致したネストされた配列要素に新しいデータを追加しています。
> db.demo643.update({"details.CountryName": "UK"}, {"$push": {"details.$.StudentDetails": {Marks:78}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })このクエリでは、「details」配列内で「CountryName」が「UK」である要素を検索し、該当する要素の「StudentDetails」配列に「Marks: 78」というドキュメントを追加しています。実行結果の「nMatched: 1」「nModified: 1」は、1件のドキュメントが一致し、正常に更新されたことを示しています。
更新結果の確認
もう一度find()メソッドを実行して、更新後のドキュメントを確認してみましょう。pretty()メソッドを付けると、見やすい形式で出力されます。
> db.demo643.find().pretty();
実行すると、以下の出力が得られます。
{
"_id" : ObjectId("5e9c737f6c954c74be91e6e3"),
"details" : [
{
"CountryName" : "US",
"StudentDetails" : [
{
"Name" : "Chris"
},
{
"SubjectName" : "MySQL"
}
]
},
{
"CountryName" : "UK",
"StudentDetails" : [
{
"Name" : "Bob"
},
{
"SubjectName" : "Java"
},
{
"Marks" : 78
}
]
}
]
}出力を見ると、「UK」のStudentDetails配列にのみ「Marks: 78」が追加され、「US」側のデータは変更されていないことがわかります。これが位置演算子「$」の効果です。
まとめ
MongoDBでネストされた埋め込みドキュメントを更新する際のポイントは以下の通りです。
- update()メソッドで、ドット記法(例:details.CountryName)を使ってネストされたフィールドを指定して検索します。
- 位置演算子「$」を使うことで、クエリ条件に一致した配列要素だけを正確に特定できます。
- $push演算子を使えば、既存の配列に新しい要素を追加できます。値を上書きしたい場合は$set演算子を使用します。
なお、MongoDBの最新バージョンでは、update()メソッドの代わりにupdateOne()やupdateMany()の使用が推奨されていますので、新規開発ではこちらを利用することをおすすめします。
-
【MongoDB】ネストされたドキュメントのキー名のみを抽出して表示する方法
MongoDBでは、配列内にネストされたドキュメント(サブドキュメント)のキー名だけを一覧として取得したいケースがあります。本記事では、insertOne()でサンプルデータを作成し、find()で内容を確認した後、集計パイプラインの$reduce、$objectToArray、$map、$concatArraysを組み合わせて、ネストされたドキュメントのキー名のみを抽出する方法を実行例付きで解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、detailsフィールドに複数のドキュメントを持つ配列を含むコレクションを作成します。 > db.dem
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO