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のテキスト検索クエリを効率的に高速化できます。
-
MongoDBで片方のフィールドがnullの場合にもう一方のフィールドを選択する方法
MongoDBで、片方のフィールドがnullの場合にもう一方のフィールドの値を取得したいときは、集計パイプラインの演算子「$ifNull」を使用します。$ifNullは、指定した式がnullまたは存在しない場合に、代替の値を返してくれる便利な演算子です。まず、サンプル用のコレクションにドキュメントを作成してみましょう。 db.demo182.insertOne({FirstName:John,LastName:Smith}); { acknowledged : true, insertedId : ObjectId(5e398ebf9e4f06af55199804) }コレクション
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド