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

MongoDBで大文字・小文字を区別しない検索を実現する方法|$regexの使い方を解説

MongoDBでは、$regex演算子を活用することで、大文字と小文字を区別しない検索(ケースインセンシティブ検索)を実現できます。正規表現にiフラグを付けることで、フィールドの値が大文字・小文字のどちらで保存されていても、柔軟にマッチングを行うことが可能です。

基本的な構文は以下の通りです。

db.yourCollectionName.find({"yourFieldName" : { '$regex':'^yourValue$'}});

また、大文字・小文字を無視するiフラグを組み合わせた、別の正規表現の書き方もあります。

db.yourCollectionName.find({"Name" : { '$regex':/^yourValue$/i}});

ここからは、実際にコレクションを作成し、それぞれの検索方法の動作を確認していきましょう。

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

まず、検索用のドキュメントを含むコレクションを作成します。以下のクエリを順に実行してください。

> db.caseInsesitiveDemo.insertOne({"Name":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8bd66293c80e3f23815e83")
}
> db.caseInsesitiveDemo.insertOne({"Name":"Johnson"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8bd66693c80e3f23815e84")
}
> db.caseInsesitiveDemo.insertOne({"Name":"Johny"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8bd66a93c80e3f23815e85")
}

登録したドキュメントの確認

find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。以下のクエリを実行してみましょう。

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

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

{ "_id" : ObjectId("5c8bd66293c80e3f23815e83"), "Name" : "John" }
{ "_id" : ObjectId("5c8bd66693c80e3f23815e84"), "Name" : "Johnson" }
{ "_id" : ObjectId("5c8bd66a93c80e3f23815e85"), "Name" : "Johny" }

部分一致検索の動作

アンカー(^や$)を付けずに正規表現を指定すると、「John」という文字列を含むすべてのドキュメントが部分一致でヒットします。

> db.caseInsesitiveDemo.find({"Name" : { '$regex' : 'John' }});

実行結果:

{ "_id" : ObjectId("5c8bd66293c80e3f23815e83"), "Name" : "John" }
{ "_id" : ObjectId("5c8bd66693c80e3f23815e84"), "Name" : "Johnson" }
{ "_id" : ObjectId("5c8bd66a93c80e3f23815e85"), "Name" : "Johny" }

このように、部分一致検索では「John」「Johnson」「Johny」の3件すべてが表示されます。

Case 1:アンカーを使った完全一致検索

「Johnson」や「Johny」を除外し、「John」と完全に一致するドキュメントだけを表示したい場合は、正規表現の先頭に^(行頭)、末尾に$(行末)を付けた以下のクエリを使用します。

> db.caseInsesitiveDemo.find({"Name" : { '$regex':'^John$'}});

実行結果:

{ "_id" : ObjectId("5c8bd66293c80e3f23815e83"), "Name" : "John" }

出力結果を見ると、「John」というドキュメントのみが表示されていることがわかります。

Case 2:大文字・小文字を区別しない完全一致検索

さらに、大文字と小文字の違いを無視して完全一致検索を行いたい場合は、正規表現にiフラグを付けます。クエリは以下の通りです。

> db.caseInsesitiveDemo.find({"Name" : { '$regex':/^John$/i}});

実行結果:

{ "_id" : ObjectId("5c8bd66293c80e3f23815e83"), "Name" : "John" }

iフラグを組み合わせることで、「john」「JOHN」「John」など、大文字・小文字の異なるバリエーションにもマッチさせることができます。

まとめ

MongoDBで大文字・小文字を区別しない検索を行うには、$regex演算子とiフラグを組み合わせるのが基本です。さらに、^$のアンカーを併用することで、部分一致ではなく完全一致の検索に絞り込むこともできます。用途に応じてこれらのオプションを使い分けることで、より精度の高いドキュメント検索が実現できます。

  1. C#で二分探索(バイナリサーチ)を実装する方法|仕組みと計算量を解説

    二分探索とは二分探索(バイナリサーチ)は、ソート済みの配列を対象とした高速な検索アルゴリズムです。探索したい値を配列の中央にある要素と比較し、一致しなかった場合は、その値が存在し得ない側の半分の領域を丸ごと除外します。この操作を残りの半分に対して繰り返すことで、効率よく目的の値を見つけ出します。例えば、下図のような配列から「62」という値を探す場合を考えてみましょう。中央の要素との比較結果から、62が存在するのは右側の領域だけであることが分かるため、左半分は完全に除外され、以降は右半分のみが探索対象となります。二分探索の計算量二分探索における各ケースの計算量は以下の通りです。最悪時間計算量O(

  2. 名前や場所からInstagramユーザーを検索する10の方法を徹底解説

    Instagramは写真や動画を共有できるSNSプラットフォームで、各ユーザーには固有のプロフィール(ユーザー名)が割り当てられています。このユーザー名を手がかりに、特定の人を見つけることができます。しかし、初心者の中には「ユーザー名がわからない」「どうやって探せばいいのか分からない」と悩む方も多いのではないでしょうか。 本記事では、名前や場所からInstagramユーザーを検索する方法を10通り詳しく解説します。さらに、Instagramのユーザー名検索に役立つ外部ツールもご紹介します。ぜひ最後までご覧ください。 名前と場所からInstagramユーザーを検索する方法 Instagramアプ