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

MongoDBの埋め込みドキュメントから特定の要素を抽出する方法($unwind・$match・$projectの活用)

MongoDBでは、配列形式の埋め込みドキュメントから特定の条件に合う要素だけを取り出したい場面がよくあります。そのような場合は、集計(Aggregation)パイプラインで $unwind$match$project を組み合わせることで、目的のデータを効率的に抽出できます。

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

まず、insertOne() メソッドを使って、学生情報を配列として持つコレクションを作成します。

> db.demo744.insertOne(
...     {
...        studentInformation:
...        [
...           {
...              studentName:"Robert",
...              grade:"A"
...           },
...           {
...              studentName:"Bob",
...              grade:"C"
...           },
...           {
...              studentName:"John",
...              grade:"B"
...           },
...           {
...              studentName:"Sam",
...              grade:"A"
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ead928a57bb72a10bcf0684")
}

登録したドキュメントの確認

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

> db.demo744.find();

実行すると、以下のような結果が出力されます。

{ "_id" : ObjectId("5ead928a57bb72a10bcf0684"), "studentInformation" : [ { "studentName" : "Robert", "grade" : "A" }, { "studentName" : "Bob", "grade" : "C" }, { "studentName" : "John", "grade" : "B" }, { "studentName" : "Sam", "grade" : "A" } ] }

埋め込みドキュメントから特定の要素を検索するクエリ

ここで、「成績(grade)が A の学生」だけを抽出してみましょう。aggregate() に3つのステージを指定した次のクエリを使用します。

> db.demo744.aggregate(
...     { $unwind: '$studentInformation' },
...     { $match: {'studentInformation.grade':"A"}},
...     { $project: {"studentInformation.studentName": 1}}
... )

各パイプラインステージの役割

$unwind

配列 studentInformation を分解し、要素ごとに個別のドキュメントへ展開します。これにより、各学生情報を1件ずつ扱えるようになります。

$match

展開されたドキュメントの中から、grade"A" のものだけをフィルタリングします。SQLの WHERE 句に相当する処理です。

$project

出力するフィールドを制御します。ここでは studentInformation.studentName のみを表示対象(1)とし、成績などの不要な情報を除外しています。

実行結果

上記のクエリを実行すると、成績が A の学生(Robert と Sam)の名前のみが出力されます。

{ "_id" : ObjectId("5ead928a57bb72a10bcf0684"), "studentInformation" : { "studentName" : "Robert" } }
{ "_id" : ObjectId("5ead928a57bb72a10bcf0684"), "studentInformation" : { "studentName" : "Sam" } }

まとめ

埋め込みドキュメント(配列)内の特定要素を取得するには、$unwind で配列を展開し、$match で条件に一致するものを絞り込み、$project で必要なフィールドだけを出力する、という流れが基本となります。このパターンを覚えておくと、ネストされた構造を持つMongoDBのデータ操作が格段に行いやすくなります。

  1. 既存のドキュメントを上書きせずにMongoDBのドキュメントを更新する方法

    MongoDBで特定のフィールドの値だけを更新したい場合には、update()メソッドと$set演算子を組み合わせて使用します。この方法を使えば、既存のドキュメントを丸ごと上書きすることなく、指定したフィールドだけを安全に変更できます。 1. コレクションの作成とドキュメントの挿入 まず、insertOne()メソッドを使って、サンプル用のコレクションにドキュメントを挿入します。 > db.demo401.insertOne( ... { ... _id : 1001, ... Name : Chris, ... SubjectName

  2. MongoDBでドキュメント内に要素が存在するかどうかを確認する方法

    MongoDBのドキュメント内に特定の要素(フィールド)が存在するかどうかを確認するには、$exists演算子を使用します。ここでは、実際にコレクションを作成してドキュメントを挿入しながら、具体的な手順をわかりやすく解説していきます。 コレクションの作成とドキュメントの挿入 まず、insertOne()メソッドを使って、サンプルデータを含むコレクション「demo497」を作成します。 > db.demo497.insertOne({"details":[{"Name":"Chris"},{"Name":&q