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

MongoDBで大きなテキストフィールドにインデックスを作成してクエリを高速化する方法

MongoDBでは、大きなテキストフィールドに対してインデックスを作成することで、検索クエリのパフォーマンスを大幅に向上させることができます。インデックスの作成には ensureIndex() メソッドを使用し、テキスト検索には $regex 演算子を組み合わせます。

インデックスの作成方法

まず、ドキュメントを格納するコレクションを作成し、対象のフィールドにインデックスを設定します。以下の例では、demo46 コレクションの「Name」フィールドに昇順のインデックスを作成しています。

> db.demo46.ensureIndex({"Name":1});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

出力結果から、コレクションが自動的に作成され、インデックス数が1から2に増えたことが確認できます。

サンプルデータの挿入

次に、insertOne() メソッドを使って複数のドキュメントを挿入します。

> db.demo46.insertOne({"Name":"John Smith"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e267004cfb11e5c34d898ed")
}
> db.demo46.insertOne({"Name":"John Doe"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e267009cfb11e5c34d898ee")
}
> db.demo46.insertOne({"Name":"Chris Brown"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e267011cfb11e5c34d898ef")
}

登録済みドキュメントの確認

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

> db.demo46.find();

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

{ "_id" : ObjectId("5e267004cfb11e5c34d898ed"), "Name" : "John Smith" }
{ "_id" : ObjectId("5e267009cfb11e5c34d898ee"), "Name" : "John Doe" }
{ "_id" : ObjectId("5e267011cfb11e5c34d898ef"), "Name" : "Chris Brown" }

$regexを使った高速な前方一致検索

インデックスが作成された状態で、$regex を使って「John」で始まる名前を検索してみましょう。正規表現パターンを /^John/ のように先頭一致(アンカー付き)で指定することが重要です。

> db.demo46.find({ Name: { $regex:/^John/}});

実行結果は以下の通りです。

{ "_id" : ObjectId("5e267009cfb11e5c34d898ee"), "Name" : "John Doe" }
{ "_id" : ObjectId("5e267004cfb11e5c34d898ed"), "Name" : "John Smith" }

パフォーマンスを最大化するポイント

  • 先頭一致(^)を使う: 正規表現が ^ で始まる場合、MongoDBはインデックスを活用できるため、コレクション全体のスキャンを回避できます。
  • 大文字小文字の区別に注意: デフォルトでは大文字小文字が区別されます。$options: "i" を指定すると大文字小文字を無視できますが、その場合はインデックスの利用効率が下がる可能性があります。
  • 最新バージョンでは createIndex() を推奨: MongoDB 3.0以降では ensureIndex() は非推奨となっており、代わりに db.collection.createIndex() の使用が推奨されています。

このように、大きなテキストフィールドに適切なインデックスを作成し、アンカー付きの正規表現と組み合わせることで、MongoDBのテキスト検索クエリを効率的に高速化できます。

  1. MongoDBで片方のフィールドがnullの場合にもう一方のフィールドを選択する方法

    MongoDBで、片方のフィールドがnullの場合にもう一方のフィールドの値を取得したいときは、集計パイプラインの演算子「$ifNull」を使用します。$ifNullは、指定した式がnullまたは存在しない場合に、代替の値を返してくれる便利な演算子です。まず、サンプル用のコレクションにドキュメントを作成してみましょう。 db.demo182.insertOne({FirstName:John,LastName:Smith}); { acknowledged : true, insertedId : ObjectId(5e398ebf9e4f06af55199804) }コレクション

  2. 【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方

    MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド