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

MongoDBで大文字と小文字を区別せずに検索する方法($regexの使い方)

MongoDBで大文字と小文字を区別しない(ケースインセンシティブな)検索を実行したい場合は、find()メソッドの中で正規表現($regex)を使用します。基本となる構文は以下の通りです。

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

正規表現のポイント

この構文で重要なのは、パターンの末尾に付ける「i」オプションです。このフラグを指定することで、マッチング時に大文字と小文字の違いが無視されます。また、^(先頭)と$(末尾)で値を囲むことで、部分一致ではなく完全一致の検索になります。

それでは、実際にサンプルコレクションを作成して動作を確認してみましょう。

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

> db.demo572.insertOne({"CountryName":"US"});{
    "acknowledged" : true, "insertedId" : ObjectId("5e915f0e581e9acd78b427f1")
}
> db.demo572.insertOne({"CountryName":"UK"});{
    "acknowledged" : true, "insertedId" : ObjectId("5e915f17581e9acd78b427f2")
}
> db.demo572.insertOne({"CountryName":"Us"});{
    "acknowledged" : true, "insertedId" : ObjectId("5e915f1b581e9acd78b427f3")
}
> db.demo572.insertOne({"CountryName":"AUS"});{
    "acknowledged" : true, "insertedId" : ObjectId("5e915f20581e9acd78b427f4")
}
> db.demo572.insertOne({"CountryName":"us"});{
    "acknowledged" : true, "insertedId" : ObjectId("5e915f25581e9acd78b427f5")
}

ここでは、「US」「UK」「Us」「AUS」「us」という5つの国名を持つドキュメントを挿入しました。あえて大文字・小文字の表記を揃えていない点に注目してください。

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

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

> db.demo572.find();

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

{ "_id" : ObjectId("5e915f0e581e9acd78b427f1"), "CountryName" : "US" }
{ "_id" : ObjectId("5e915f17581e9acd78b427f2"), "CountryName" : "UK" }
{ "_id" : ObjectId("5e915f1b581e9acd78b427f3"), "CountryName" : "Us" }
{ "_id" : ObjectId("5e915f20581e9acd78b427f4"), "CountryName" : "AUS" }
{ "_id" : ObjectId("5e915f25581e9acd78b427f5"), "CountryName" : "us" }

大文字と小文字を区別しない検索クエリの実行

それでは本題の、大文字と小文字を区別しない検索のクエリです。$regexに「/^US$/i」を指定して実行してみます。

> db.demo572.find({"CountryName" : { '$regex' : /^US$/i}});

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

{ "_id" : ObjectId("5e915f0e581e9acd78b427f1"), "CountryName" : "US" }
{ "_id" : ObjectId("5e915f1b581e9acd78b427f3"), "CountryName" : "Us" }
{ "_id" : ObjectId("5e915f25581e9acd78b427f5"), "CountryName" : "us" }

ご覧のとおり、「US」「Us」「us」という異なる表記のドキュメントがすべてヒットしました。一方で「UK」や「AUS」は値が異なるため除外されており、意図どおりの完全一致検索ができています。

補足:$optionsを使った書き方

正規表現のオプションは、$optionsフィールドを使って指定することもできます。こちらの書き方の方が可読性が高いと感じる場合もあるでしょう。

> db.demo572.find({"CountryName" : { "$regex" : "^US$", "$options" : "i" }});

どちらの書き方でも結果は同じになります。用途やチームのコーディング規約に合わせて使い分けるとよいでしょう。

  1. MongoDBで大文字と小文字を区別せずに特定の名前のドキュメントを取得するクエリ

    MongoDBで、フィールド値の大文字と小文字の違いに関係なくドキュメントを検索したい場合には、$regex演算子を使用します。この記事では、「David」という名前を持つドキュメントを、大文字・小文字を問わず検索する方法を解説します。サンプルコレクションの作成まず、デモ用のコレクションにドキュメントを挿入します。意図的に「david」「DAVID」「David」など、大文字と小文字が異なる名前を登録している点に注目してください。> db.demo700.insertOne( { details: [ { Name:david }]}); { acknowledged : true

  2. MongoDBの$regex演算子で大文字と小文字を区別しない検索を行う方法(iオプション)

    MongoDBで大文字と小文字を区別せずに文字列検索を行いたい場合は、$regex演算子に「i」(case insensitive:大文字と小文字を区別しない)オプションを指定します。この記事では、実際にコレクションを作成し、「mongodb」という文字列を表記の違いにかかわらずすべて取得する方法を、サンプルコード付きで解説します。ドキュメントを含むコレクションの作成まず、insertOne()メソッドを使って、異なる表記(MySQL、MongoDB、mongodb、MONGODB)のドキュメントを持つコレクションを作成しましょう。> db.demo759.insertOne({Subj