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

フィールド名が不明なMongoDBサブドキュメントのクエリにもインデックスは有効?作成方法を解説

MongoDBでは、フィールド名が事前に確定していないサブドキュメント(埋め込みドキュメント)を対象にクエリを実行する場合でも、適切にインデックスを作成しておけば検索性能を大きく向上させることができます。ポイントは、「properties.k」のようにキー用のフィールド、「properties.v」のように値用のフィールドに対してインデックスを張ることです。かつてはensureIndex()メソッドでこの処理を行っていましたが、現在のバージョンではcreateIndex()の使用が推奨されています。

それでは、実際の例を見ながら確認していきましょう。まず、ドキュメントを格納するコレクションを作成します。

> db.demo274.insertOne({"details":[{StudentFirstName:"Chris",StudentLastName:"Brown"},
...   {StudentFirstName:"David",StudentLastName:"Miller"},
...   {StudentFirstName:"John",StudentLastName:"Smith"},
...   {StudentFirstName:"John",StudentLastName:"Doe"}
... ]
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e48de35dd099650a5401a42")
}

続いて、find()メソッドを使ってコレクション内のすべてのドキュメントを表示してみます。

> db.demo274.find().pretty();

出力結果

上記のコマンドを実行すると、次のような出力が得られます。

{
   "_id" : ObjectId("5e48de35dd099650a5401a42"),
   "details" : [
      {
         "StudentFirstName" : "Chris",
         "StudentLastName" : "Brown"
      },
      {
         "StudentFirstName" : "David",
         "StudentLastName" : "Miller"
      },
      {
         "StudentFirstName" : "John",
         "StudentLastName" : "Smith"
      },
      {
         "StudentFirstName" : "John",
         "StudentLastName" : "Doe"
      }
   ]
}

ここからが本題です。既知のフィールド名なしでMongoDBのサブドキュメントをクエリする際にインデックスを活用するには、サブドキュメント内の各フィールドに対して次のように複合インデックスを作成します。

> db.demo274.ensureIndex({"details.StudentFirstName": 1, "details.StudentLastName": 1});

なお、ensureIndex()はすでに非推奨(deprecated)となっているため、最新のMongoDBでは同じ動作をするcreateIndex()を使用してください。

> db.demo274.createIndex({"details.StudentFirstName": 1, "details.StudentLastName": 1});

出力結果

インデックスの作成に成功すると、次のような結果が返されます。

{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

補足:マルチキーインデックスとして自動的に機能

detailsフィールドはサブドキュメントの配列であるため、このように作成したインデックスは自動的に「マルチキーインデックス」として動作します。その結果、db.demo274.find({"details.StudentFirstName": "John"}) のようなクエリでも、コレクション全体をスキャン(コレクションスキャン)することなく、インデックスを経由して該当ドキュメントを高速に検索できるようになります。スキーマが柔軟で事前にフィールド名を確定できないケースでも、想定されるクエリパターンに合わせてサブドキュメントのフィールドへインデックスを設計しておくことが、MongoDBのパフォーマンス最適化における重要なポイントです。


  1. MongoDBの_idフィールドを非表示にする方法

    MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo

  2. MongoDB 4でドキュメントをソートし、特定の1つのフィールドだけを表示する方法

    MongoDB 4でドキュメントを並べ替えるには、sort()メソッドを使用します。さらに、ソートした特定の1つのフィールドのみを表示したい場合は、プロジェクション(射影)を組み合わせて、表示したいフィールドに「1」を設定します。この記事では、実際のコード例を使って手順を順番に解説していきます。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、テスト用のコレクション「demo611」にドキュメントを登録します。> db.demo611.insertOne({Name:Chris}); { acknowledged : true, insertedI