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

MongoDBでネストされたJSONオブジェクトのデータのみを取得する方法

MongoDBでネストされたJSONオブジェクトのデータだけを取得したい場合は、findOne()メソッドと$elemMatch演算子を組み合わせることで実現できます。この記事では、実際のコード例を使いながら、配列内の特定の要素だけを抽出する手順をわかりやすく解説します。

1. サンプルコレクションの作成

まず、ネストされた構造を持つドキュメントを含むコレクションを作成しましょう。ここでは、学生「Chris」が受講している科目と、各科目の講師情報がネストされたJSONデータを例にします。

> db.demo109.insertOne(
...     {
...        "Name" : "Chris",
...        "Subjects" : [
...           {
...              "Id" : "100",
...              "Name":"MySQL",
...              "InstructorDetails" : [
...                 {
...                    "Name" : "John"
...                 }
...              ]
...           },
...           {
...              "Id" : "101",
...              "Name":"MongoDB",
...              "InstructorDetails" : [
...                 {
...                    "Name" : "Mike"
...                 }
...              ]
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e2ee7df9fd5fd66da21447a")
}

2. コレクション内の全ドキュメントを確認

作成したコレクションの内容は、find()メソッドを使って確認できます。

> db.demo109.find();

実行すると、以下のような出力が得られます。

{
    "_id" : ObjectId("5e2ee7df9fd5fd66da21447a"), "Name" : "Chris", "Subjects" : [
       { "Id" : "100", "Name" : "MySQL", "InstructorDetails" : [ { "Name" : "John" } ] },
       { "Id" : "101", "Name" : "MongoDB", "InstructorDetails" : [ { "Name" : "Mike" } ] }
    ] 
}

3. $elemMatchでネストされたデータのみを取得する

ここからが本題です。findOne()の第2引数(プロジェクション)に$elemMatchを指定することで、「Subjects」配列の中から条件に一致する要素だけを取得できます。以下のクエリでは、Idが「100」である科目のデータのみを抽出しています。

> db.demo109.findOne(
... { Name: "Chris"}
... , { 'Subjects': { $elemMatch:{'Id':"100"} } }
... , function (err, doc) { console.log(doc) });

実行結果は次のとおりです。

{
    "_id" : ObjectId("5e2ee7df9fd5fd66da21447a"),
    "Subjects" : [
       {
          "Id" : "100",
          "Name" : "MySQL",
          "InstructorDetails" : [
             {
                "Name" : "John"
             }
          ]
       }
    ]
}

ポイントまとめ

  • findOne()の第1引数には検索条件(ドキュメント全体のフィルタ)を指定します。
  • 第2引数のプロジェクションで$elemMatchを使用すると、配列内の一致する要素だけが返されます。
  • 条件に一致する要素がない場合、「Subjects」フィールド自体が結果に含まれません。
  • 複数件の一致を取得したい場合は、find()$elemMatch、またはMongoDB 3.4以降なら$filter演算子の活用も検討するとよいでしょう。

このように、$elemMatchを活用すれば、深くネストされたJSON構造から必要な部分だけを効率的に取り出すことができます。APIレスポンスの軽量化や、フロントエンドへ渡すデータの絞り込みなどにも役立つテクニックなので、ぜひ覚えておきましょう。

  1. JavaでJacksonのObject Modelを使ってJSONデータをマッピングする方法

    JavaでJSONを扱う際に広く利用されているJacksonライブラリでは、ObjectMapperクラスがJavaオブジェクトとJSON構造の間の相互変換を担います。 JSONデータをオブジェクトモデル(Object Model)として表現し、特定のJavaオブジェクトへマッピングするには、ツリー構造を活用します。このアプローチでは、JSONコンテンツ全体が一度にメモリへ読み込まれ、木構造として保持されます。 処理の流れはシンプルです。まずJSONデータをJsonNodeオブジェクトとして読み込み、続いてObjectMapperクラスのtreeToValue()メソッドを呼び出すことで、その

  2. JavaScriptでオブジェクトの値を取得する方法:Object.values()と_.values()の違いを解説

    JavaScriptにはObject.values()など、オブジェクトの値を取得するためのメソッドがいくつか用意されています。しかし、これらの標準メソッドでは値を取り出すまでの手順がやや長くなりがちです。そこで便利なのが、JavaScriptライブラリ「Underscore.js」が提供する_.values()メソッドです。このメソッドを使えば、forループを記述することなく、オブジェクトの値を直接取得できます。 Object.values()を使った例 まずは標準メソッドであるObject.values()を使った例です。このメソッドで取得した値を順番に表示するには、for...ofループ