MongoDBで$unwindを2回使って特定の埋め込みドキュメントを取得する方法
MongoDBで$unwindを2回使用して特定の埋め込みドキュメントを取得する
MongoDBでは、ネストされた配列の中から特定の埋め込みドキュメントだけを取り出したいケースがよくあります。そのような場合、集計パイプライン(aggregate)で $unwind を2回使用し、$match で条件を絞り込む方法が効果的です。この記事では、具体的なサンプルコードとともに手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを挿入してコレクションを作成しましょう。以下の例では、国情報(Info1)の中にさらに人物情報(Info2)がネストされた構造を持つドキュメントを登録しています。
> db.demo631.insert(
... {
... id: "101",
... Info1: [
... {
... CountryName : "US",
... Info2 : [
... {
... Name:"Chris",
... Age:24
... },{
... Name:"Bob",
... Age:22
... }
... ]
... }
... ]
... }
... );
WriteResult({ "nInserted" : 1 })
挿入が成功すると、WriteResult({ "nInserted" : 1 }) が返されます。
2. コレクション内の全ドキュメントを確認する
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo631.find();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e9b0eb16c954c74be91e6bf"), "id" : "101", "Info1" : [ { "CountryName" : "US", "Info2" : [ { "Name" : "Chris", "Age" : 24 }, { "Name" : "Bob", "Age" : 22 } ] } ] }3. $unwindと$matchで特定の埋め込みドキュメントを抽出する
次に、特定の埋め込みドキュメントを返すクエリを紹介します。ポイントは以下の3ステップです。
- 最初の $unwind で「Info1」配列を展開する
- 2回目の $unwind で「Info1.Info2」配列を展開する
- $match で条件に合致するドキュメント(ここではAgeが22)を絞り込む
> db.demo631.aggregate([
... { "$unwind": "$Info1" },
... { "$unwind": "$Info1.Info2" },
... { "$match": { "Info1.Info2.Age": 22 } }
... ])
このクエリを実行すると、以下のようにAgeが22のドキュメント(Bobの情報)だけが抽出されます。
{ "_id" : ObjectId("5e9b0eb16c954c74be91e6bf"), "id" : "101", "Info1" : { "CountryName" : "US", "Info2" : { "Name" : "Bob", "Age" : 22 } } }まとめ
ネストされた配列から特定の埋め込みドキュメントを取得するには、$unwindで各階層の配列を順番に展開し、$matchで条件を指定するのが基本のアプローチです。$unwindを2回使用することで、二重にネストされた配列構造でも目的のドキュメントを正確に取り出せます。条件を変更すれば、名前やその他のフィールドでの絞り込みにも簡単に応用できます。
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id:
-
MongoDBドキュメントから特定の値をフィルタリングする方法
MongoDBドキュメントから特定の値をフィルタリングする方法MongoDBでドキュメント内の配列から特定の値を抽出したい場合は、集計パイプラインで $filter を使用します。この記事では、実際にコレクションを作成し、特定の条件に一致する要素だけをフィルタリングする手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを含むドキュメントを持つコレクションを作成します。 db.demo751.insertOne( ... { ... _id: 101, ... details: [