MongoDBでドキュメントに埋め込まれたデータを取得する方法
MongoDBでは、一つのドキュメントの中に別のドキュメント(サブドキュメント)を入れ子状に保存できる「埋め込みドキュメント」という仕組みが用意されています。この記事では、埋め込まれたデータを取得するための基本構文と、実際のコード例を通してその使い方をわかりやすく解説します。
埋め込みデータを取得する基本構文
MongoDBドキュメント内の埋め込みデータを取得するには、find()メソッドの第2引数(プロジェクション)で、ドット記法を使ってフィールドを指定します。基本構文は次の通りです。
db.yourCollectionName.find({}, {'yourOuterKeyName.yourInnerKeyName': 1}).pretty();
- 第1引数(検索条件): 空のオブジェクト「{}」を渡すと、コレクション内のすべてのドキュメントが対象になります。
- 第2引数(プロジェクション): 取得したいフィールドを「1」で指定します。これにより指定したフィールドのみが返されます(_idはデフォルトで含まれます)。
サンプルコレクションの作成
まず、埋め込みドキュメントを含むコレクションを作成しましょう。ここでは学生名と、その中に複数のプロジェクト情報を持つ構造のドキュメントを挿入します。
> db.embeddedCollectionDemo.insertOne(
... {
... "StudentName" : "Larry",
... "StudentDetails": {
... "Larry1234": {"ProjectName": "Student Web Tracker"},
... "Larry7645": {"ProjectName": "Hospital Management System"},
... "Larry9879": {"ProjectName": "Library Management System"}
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5c98a100330fd0aa0d2fe4c5")
}
登録した全ドキュメントの表示
作成したコレクション内のすべてのドキュメントを表示するには、次のクエリを実行します。
> db.embeddedCollectionDemo.find().pretty();
実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5c98a100330fd0aa0d2fe4c5"),
"StudentName" : "Larry",
"StudentDetails" : {
"Larry1234" : {
"ProjectName" : "Student Web Tracker"
},
"Larry7645" : {
"ProjectName" : "Hospital Management System"
},
"Larry9879" : {
"ProjectName" : "Library Management System"
}
}
}
埋め込みデータのみを取得するクエリ
それでは本題の、埋め込みデータの取得方法です。StudentDetailsフィールドの中にある「Larry7645」キーのデータだけを取り出すには、ドット記法で「StudentDetails.Larry7645」のように指定します。
> db.embeddedCollectionDemo.find({}, {'StudentDetails.Larry7645': 1}).pretty();
このクエリを実行すると、次の出力が得られます。
{
"_id" : ObjectId("5c98a100330fd0aa0d2fe4c5"),
"StudentDetails" : {
"Larry7645" : {
"ProjectName" : "Hospital Management System"
}
}
}
このように、_idと指定した埋め込みフィールドのみが出力されます。ネストが深い場合でも、「外側のキー.内側のキー」の形式で階層をたどることで、目的のデータだけを効率的に取得できます。
まとめ
MongoDBで埋め込みドキュメントのデータを取得する際は、find()メソッドのプロジェクションでドット記法を使用するのが基本です。不要なデータを除外して必要な部分だけを取得することで、アプリケーション間の通信量削減やパフォーマンス向上にもつながります。サブドキュメントを扱う際は、ぜひこの手法を活用してください。
-
MongoDBで$unwindを2回使って特定の埋め込みドキュメントを取得する方法
MongoDBで$unwindを2回使用して特定の埋め込みドキュメントを取得するMongoDBでは、ネストされた配列の中から特定の埋め込みドキュメントだけを取り出したいケースがよくあります。そのような場合、集計パイプライン(aggregate)で $unwind を2回使用し、$match で条件を絞り込む方法が効果的です。この記事では、具体的なサンプルコードとともに手順を解説します。1. サンプルコレクションの作成まず、ドキュメントを挿入してコレクションを作成しましょう。以下の例では、国情報(Info1)の中にさらに人物情報(Info2)がネストされた構造を持つドキュメントを登録しています。
-
MongoDBの埋め込みドキュメントから特定の要素を抽出する方法($unwind・$match・$projectの活用)
MongoDBでは、配列形式の埋め込みドキュメントから特定の条件に合う要素だけを取り出したい場面がよくあります。そのような場合は、集計(Aggregation)パイプラインで $unwind、$match、$project を組み合わせることで、目的のデータを効率的に抽出できます。コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使って、学生情報を配列として持つコレクションを作成します。> db.demo744.insertOne( ... { ... studentInformation: ... [ ...