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

【MongoDB】インデックス未作成のフィールドに対して複雑なクエリを効率的に実行する方法

MongoDBでテキストインデックスを活用した効率的なクエリ実行

MongoDBで文字列フィールドに対する柔軟な検索(全文検索)を高速に行うには、テキストインデックスを作成するのが最も効果的です。インデックスが存在しない状態で複雑な条件のクエリを実行すると、コレクション全体をスキャンする「コレクションスキャン」が発生し、データ量が増えるほどパフォーマンスが大幅に低下します。本記事では、実際のコード例を使いながら、テキストインデックスを作成して複雑なクエリを効率的に実行する手順を解説します。

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

まずは、サンプル用のコレクションにドキュメントを挿入してみましょう。ここでは「SubjectName」というフィールドを持つ3件のドキュメントを作成します。

> db.demo400.insertOne({SubjectName:"Java Spring"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e610720fac4d418a0178572")
}
> db.demo400.insertOne({SubjectName:"Spring Hibernate"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e61072dfac4d418a0178573")
}
> db.demo400.insertOne({SubjectName:"Java Hibernate"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e610736fac4d418a0178574")
}

2. テキストインデックスの作成

続いて、createIndex()メソッドを使って「SubjectName」フィールドにテキストインデックスを作成します。値に "text" を指定するのがポイントです。

> db.demo400.createIndex({SubjectName:"text"});
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

出力結果から、インデックス数が1から2に増えたことが確認できます。なお、1つのコレクションに対して作成できるテキストインデックスは最大1つという制限がある点に注意してください。

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

挿入したすべてのドキュメントを、find()メソッドで確認してみます。

> db.demo400.find();

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

{ "_id" : ObjectId("5e610720fac4d418a0178572"), "SubjectName" : "Java Spring" }
{ "_id" : ObjectId("5e61072dfac4d418a0178573"), "SubjectName" : "Spring Hibernate" }
{ "_id" : ObjectId("5e610736fac4d418a0178574"), "SubjectName" : "Java Hibernate" }

4. $text検索で複雑なクエリを効率的に実行

テキストインデックスが作成できたら、$text演算子と$searchを組み合わせることで、文字列フィールドに対する高度な検索を高速に実行できます。以下は、「Spring」というキーワードを含むドキュメントを検索する例です。

> db.demo400.find({ $text: { $search: "Spring" } } )

実行すると、キーワードに一致するドキュメントのみが返されます。

{ "_id" : ObjectId("5e61072dfac4d418a0178573"), "SubjectName" : "Spring Hibernate" }
{ "_id" : ObjectId("5e610720fac4d418a0178572"), "SubjectName" : "Java Spring" }

まとめ

このように、MongoDBでは対象フィールドにテキストインデックスを作成しておくことで、$text / $searchによる全文検索を効率的に実行できます。部分一致や正規表現での検索はどうしてもパフォーマンスが落ちやすいですが、テキストインデックスを利用すれば大規模なコレクションでも高速な検索が可能になります。検索対象となる文字列フィールドが明確な場合は、ぜひテキストインデックスの活用を検討してみてください。

  1. MongoDBでコンソールをクリアする2つの方法|ショートカット「Ctrl + L」とコマンド「cls」の使い方

    MongoDBのシェル(mongo / mongosh)を使っていると、実行したクエリや結果がどんどん積み重なり、画面が見づらくなることがあります。そんなときに便利なのがコンソールのクリア機能です。MongoDBでは、以下の2つの方法でコンソールをクリアできます。 方法1:キーボードショートカット「Ctrl + L」を使う 最も手軽なのが、キーボードショートカットを使う方法です。次のキーを押すだけで、即座にコンソールをクリアできます。 Ctrl + L このキーを押すと、それまで表示されていたログや実行結果がすべて消え、まっさらな状態になります。Linuxのターミナルなどと同じ操作感なので、

  2. mongoコマンドでMongoDBシェルを起動する方法

    MongoDBシェルの起動方法MongoDBのシェル(対話型インターフェース)を起動するには、mongo コマンドを使用します。mongosではなく、クライアント用のシェルである mongo コマンドを実行する点に注意してください。基本構文> mongo起動手順まず、コマンドプロンプト(Windowsの場合はcmd)を開き、MongoDBがインストールされているbinディレクトリへ移動します。以下のようなパスになります。cd C:\Program Files\MongoDB\Server\<バージョン>\binbinディレクトリに移動したら、次のコマンドを入力してMongoD