MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法
MongoDBの埋め込みドキュメントをクエリするには?
MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。
1. サンプルコレクションの作成
まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。
> db.demo705.insertOne(
... {
... _id:101,
... "Information":
... [
... {
... "StudentName":"Chris",
... "StudentAge":21
... },
... {
... "StudentName":"David",
... "StudentAge":23
... },
... {
... "StudentName":"Bob",
... "StudentAge":20
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }2. 登録したドキュメントの確認
挿入したすべてのドキュメントを表示するには、find()メソッドを使用します。
> db.demo705.find();
実行すると、以下のような出力が得られます。
{ "_id" : 101, "Information" : [ { "StudentName" : "Chris", "StudentAge" : 21 }, { "StudentName" : "David", "StudentAge" : 23 }, { "StudentName" : "Bob", "StudentAge" : 20 } ] }3. aggregate()による埋め込みドキュメントのクエリ
ここからが本題です。埋め込みドキュメントをクエリするには、aggregate()パイプラインの中で以下のステージを組み合わせます。
- $unwind: 配列「Information」を個々のドキュメントに分解します。
- $match: 条件に一致するドキュメントだけをフィルタリングします。ここでは「StudentAge」が21以上という条件を指定しています。
- $project: 出力するフィールドを選択します。ここでは「Information」フィールドのみを出力しています。
> db.demo705.aggregate(
... { $unwind: '$Information' },
... { $match: {'Information.StudentAge': {$gte: 21}}},
... { $project: {Information: 1}}
... )4. クエリ結果
上記の集計パイプラインを実行すると、年齢が21歳以上の学生情報だけが抽出され、以下のような出力が得られます。
{ "_id" : 101, "Information" : { "StudentName" : "Chris", "StudentAge" : 21 } }
{ "_id" : 101, "Information" : { "StudentName" : "David", "StudentAge" : 23 } }まとめ
このように、MongoDBで配列形式の埋め込みドキュメントを扱う際は、$unwindで配列を展開し、$matchで条件を絞り込むのが基本のアプローチです。なお、単純な条件検索であればfind()メソッドに「Information.StudentAge」のようなドット記法で直接条件を指定する方法もありますが、配列要素ごとに柔軟に加工・整形したい場合はaggregate()の利用が適しています。
-
MongoDBで埋め込みドキュメントの配列をクエリし、新しいドキュメントをプッシュする方法
MongoDBで埋め込みドキュメントの配列に対してクエリを実行し、条件を満たす場合にのみ新しいドキュメントを追加したい場合は、updateメソッドと$push演算子を組み合わせて使用します。ここでは、実際のサンプルコードを使って手順を詳しく解説します。 手順1:サンプルコレクションの作成 まず、insertOne()メソッドを使って、埋め込みドキュメントの配列を含むドキュメントを作成しましょう。 > db.demo573.insertOne( ... { ... _id :101, ... SearchInformation : [ ...
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: