MongoDBの集約フレームワークで埋め込みオブジェクトをドキュメントとして取得する方法
MongoDBで埋め込みオブジェクト(ネストされたドキュメント)を独立したドキュメントとして取得したい場合は、集約フレームワークの $replaceRoot ステージを使用します。$replaceRoot は、指定したフィールドの内容を新しいルートドキュメントとして昇格させるためのステージです。ここでは、実際のコード例とともに手順を解説します。
サンプルコレクションの作成
まず、埋め込みオブジェクトを含むドキュメントを持つコレクションを作成します。
> db.embeddedObjectDemo.insertOne(
{ _id: new ObjectId(),
"UserDetails": { "UserName": "John", "UserAge": 24, "UserEmailId": "John22@gmail.com" }
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ced580fef71edecf6a1f693")
}
> db.embeddedObjectDemo.insertOne( { _id: new ObjectId(), "UserDetails": { "UserName": "Carol", "UserAge": 26, "UserEmailId": "Carol123@gmail.com" } } );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ced5828ef71edecf6a1f694")
}
find()メソッドですべてのドキュメントを確認する
続いて、find()メソッドを使ってコレクション内のすべてのドキュメントを表示してみましょう。
> db.embeddedObjectDemo.find().pretty();
上記のクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5ced580fef71edecf6a1f693"),
"UserDetails" : {
"UserName" : "John",
"UserAge" : 24,
"UserEmailId" : "John22@gmail.com"
}
}
{
"_id" : ObjectId("5ced5828ef71edecf6a1f694"),
"UserDetails" : {
"UserName" : "Carol",
"UserAge" : 26,
"UserEmailId" : "Carol123@gmail.com"
}
}
$replaceRootで埋め込みオブジェクトをドキュメントとして取得する
それでは本題です。MongoDBの集約フレームワーク(aggregate)と $replaceRoot を組み合わせることで、UserDetails フィールドの中身を独立したドキュメントとして取得できます。
> db.embeddedObjectDemo.aggregate( [
{
$replaceRoot: { newRoot: "$UserDetails" }
}
] );
このクエリを実行すると、各ドキュメントの UserDetails フィールドがそのままルートドキュメントとして出力されます。
{ "UserName" : "John", "UserAge" : 24, "UserEmailId" : "John22@gmail.com" }
{ "UserName" : "Carol", "UserAge" : 26, "UserEmailId" : "Carol123@gmail.com" }
補足:利用時の注意点
$replaceRoot を使う際は、いくつかのポイントに注意が必要です。
- 元の_idは失われる:newRoot に元の
_idも残したい場合は、事前に$addFieldsや$projectで UserDetails 内にコピーしておく必要があります。 - フィールドが存在しない場合のエラー:指定したフィールドが存在しない、またはドキュメント型でない場合、デフォルトではエラーになります。
$matchで対象を事前に絞り込むか、onErrorオプションを活用すると安全です。
このように、$replaceRoot を活用すれば、ネストされたオブジェクトをシンプルなクエリでフラットなドキュメントへ変換でき、データの加工や出力形式の調整が非常に柔軟になります。
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...
-
MongoDBの埋め込みドキュメントから特定の要素を抽出する方法($unwind・$match・$projectの活用)
MongoDBでは、配列形式の埋め込みドキュメントから特定の条件に合う要素だけを取り出したい場面がよくあります。そのような場合は、集計(Aggregation)パイプラインで $unwind、$match、$project を組み合わせることで、目的のデータを効率的に抽出できます。コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使って、学生情報を配列として持つコレクションを作成します。> db.demo744.insertOne( ... { ... studentInformation: ... [ ...