MongoDBで大文字と小文字を区別しない検索を行うクエリの書き方
MongoDBでは、正規表現を活用することで、大文字と小文字を区別しない柔軟な検索を実現できます。本記事では、実際にコレクションを作成しながら、大文字・小文字を無視した検索クエリの書き方を解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。ここでは「demo186」というコレクションに、ユーザーのメールアドレスとユーザー名を登録します。
> db.demo186.insertOne({"UserEmailId":"JOHN@GMAIL.COM","UserName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e399d769e4f06af55199808")
}
> db.demo186.insertOne({"UserEmailId":"chris@gmail.com","UserName":"chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e399d879e4f06af55199809")
}
> db.demo186.insertOne({"UserEmailId":"DAVID@GMAIL.COM","UserName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e399d979e4f06af5519980a")
}
上記の例では、メールアドレスが大文字(JOHN@GMAIL.COM)、小文字(chris@gmail.com)、大文字(DAVID@GMAIL.COM)と混在している点に注目してください。
登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo186.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e399d769e4f06af55199808"), "UserEmailId" : "JOHN@GMAIL.COM", "UserName" : "John" }
{ "_id" : ObjectId("5e399d879e4f06af55199809"), "UserEmailId" : "chris@gmail.com", "UserName" : "chris" }
{ "_id" : ObjectId("5e399d979e4f06af5519980a"), "UserEmailId" : "DAVID@GMAIL.COM", "UserName" : "David" }
大文字と小文字を区別しない検索クエリ
それでは本題の、大文字と小文字を区別せずに検索するクエリを見てみましょう。ポイントは、検索条件に正規表現を使用し、パターンの末尾にフラグ(ignore case)を付けることです。
以下の例では、「john@gmail.com」と「david@gmail.com」を小文字で指定していますが、$in演算子と組み合わせた正規表現により、大文字で保存されているドキュメントも一致対象になります。
> var userMailId = [ /john@gmail.com/i, /david@gmail.com/i ]
> db.demo186.find({
... '$or': [
... { 'UserEmailId': { '$in': userMailId} },
... { 'UserName': 'John' }
... ]
...})
このクエリの構成要素は以下の通りです。
- 正規表現の /i フラグ: 大文字と小文字の違いを無視してマッチングを行います。
- $in演算子: 指定した複数のパターンのいずれかに一致するドキュメントを抽出します。
- $or演算子: メールアドレス条件またはユーザー名条件のどちらかを満たすドキュメントを取得します。
実行結果
クエリを実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5e399d769e4f06af55199808"), "UserEmailId" : "JOHN@GMAIL.COM", "UserName" : "John" }
{ "_id" : ObjectId("5e399d979e4f06af5519980a"), "UserEmailId" : "DAVID@GMAIL.COM", "UserName" : "David" }
ご覧のとおり、検索時には小文字の「john@gmail.com」「david@gmail.com」を指定しましたが、大文字で保存されている「JOHN@GMAIL.COM」「DAVID@GMAIL.COM」のドキュメントも正しく取得できています。一方、「chris@gmail.com」は検索条件に含まれていないため除外されています。
まとめ
MongoDBで大文字と小文字を区別しない検索を行うには、正規表現にフラグを付けるのが最もシンプルな方法です。$inや$orなどの演算子と組み合わせることで、複数の候補に対して柔軟にケースインセンシティブな検索が可能になります。ユーザー入力値の曖昧さを吸収したい場面(メールアドレス検索など)で特に役立つテクニックなので、ぜひ活用してみてください。
-
MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法
MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127
-
MongoDBの$regex演算子で大文字と小文字を区別しない検索を行う方法(iオプション)
MongoDBで大文字と小文字を区別せずに文字列検索を行いたい場合は、$regex演算子に「i」(case insensitive:大文字と小文字を区別しない)オプションを指定します。この記事では、実際にコレクションを作成し、「mongodb」という文字列を表記の違いにかかわらずすべて取得する方法を、サンプルコード付きで解説します。ドキュメントを含むコレクションの作成まず、insertOne()メソッドを使って、異なる表記(MySQL、MongoDB、mongodb、MONGODB)のドキュメントを持つコレクションを作成しましょう。> db.demo759.insertOne({Subj