MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでサブドキュメントを除外・フィルタリングする方法:aggregateと$unwindの活用

MongoDBでサブドキュメントを除外するには?

MongoDBで配列内のサブドキュメント(ネストされたドキュメント)を条件に基づいて除外・抽出したい場合は、aggregation(集計パイプライン)を使用し、その中で$unwind演算子を組み合わせるのが効果的です。

$unwindは、配列フィールドを展開して各要素を個別のドキュメントとして扱えるようにする演算子です。これにより、$matchステージで特定の条件に合致するサブドキュメントだけを絞り込むことができます。

1. コレクションの作成とドキュメントの挿入

まず、insertOne()メソッドを使ってサンプルのコレクションを作成しましょう。

> db.demo662.insertOne(
... {
... "details":[
... {
... Name:"Chris",
... Marks:35
... },
... {
... Name:"Bob",
... Marks:45
... },
... {
... Name:"David",
... Marks:30
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea1b2be24113ea5458c7d04")
}

2. find()メソッドで全ドキュメントを表示

find()メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。

> db.demo662.find();

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5ea1b2be24113ea5458c7d04"), "details" : [ { "Name" : "Chris", "Marks" : 35 }, { "Name" : "Bob", "Marks" : 45 }, { "Name" : "David", "Marks" : 30 } ] }

3. サブドキュメントをフィルタリングするクエリ

ここでは、「Marks(点数)が40より大きい」サブドキュメントだけを抽出してみましょう。まず$unwindでdetails配列を展開し、続く$matchで条件に合致する要素のみを残します。

> db.demo662.aggregate({$unwind:"$details"},{$match:{"details.Marks":{$gt:40}}})

このクエリを実行すると、以下の出力が得られます。

{ "_id" : ObjectId("5ea1b2be24113ea5458c7d04"), "details" : { "Name" : "Bob", "Marks" : 45 } }

ポイントまとめ

  • $unwind:配列フィールドを展開し、各要素を独立したドキュメントとして処理できるようにします。
  • $match:展開後のドキュメントに対して条件(この例ではMarks > 40)を適用し、該当するものだけを抽出します。
  • 元のドキュメント構造が変わるため、結果では配列ではなく単一のオブジェクトとしてdetailsが返される点に注意してください。

このように、aggregateパイプラインで$unwindと$matchを組み合わせることで、MongoDBの配列内サブドキュメントを柔軟にフィルタリングできます。より複雑な条件が必要な場合は、$projectや$groupなどのステージも追加すると便利です。

  1. 単純なクエリを使ってMongoDBのドキュメントをフィルタリングする方法

    $match演算子によるドキュメントのフィルタリングMongoDBで単純なクエリを使ってドキュメントをフィルタリングするには、集計パイプライン(aggregate)の中で$match演算子を使用します。$matchは、指定された条件に一致するドキュメントだけを次のパイプラインステージへ通過させる役割を持つステージです。まずは、ドキュメントを含むコレクションを作成してみましょう。> db.demo629.insertOne(...    {...       "Subje

  2. MongoDBでネストしたサブドキュメントをフィルタリングする方法(aggregateと$unwind活用)

    MongoDBでは、配列の中にさらに配列(サブドキュメント)がネストしている構造を持つドキュメントから、特定の条件に合致する要素だけを抽出したいケースがあります。このような場合、aggregate()メソッドと$unwind演算子を組み合わせることで実現できます。本記事では、実際のコード例を使いながら、ネストしたサブドキュメントのフィルタリング手順を解説します。サンプルコレクションの作成まず、ネストしたサブドキュメントを含むドキュメントを挿入して、コレクションを作成しましょう。> db.demo583.insert([ ... { ... details1 : [