MongoDBで「LIKE」検索を実装する方法|正規表現を使って特定の文字を含むデータを取得する
SQLの「LIKE」句のように、MongoDBでも部分一致検索を行いたい場面は多くあります。例えば、「Jで始まるユーザー名」や「メールアドレスに特定の文字を含むレコード」を抽出したい場合などです。
MongoDBにはSQLのLIKE句が直接用意されていませんが、代わりに正規表現(Regex)を使用することで、同様の部分一致検索を実現できます。書式はシンプルで、スラッシュ「/ /」で囲んだ間に検索したい文字を記述するだけです。
正規表現による「LIKE」検索の基本構文
/J/
上記の例では、「J」という文字を含むすべての文字列にマッチします。それでは、実際にサンプルコレクションを作成して動作を確認してみましょう。
サンプルコレクションの作成
まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。
> db.demo554.insertOne({"UserName":"John","UserMailId":"John@gmail.com"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f1cfed1d72c4545cb8679")
}
> db.demo554.insertOne({"UserName":"Chris","UserMailId":"Chris@gmail.com"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f1d0cd1d72c4545cb867a")
}
> db.demo554.insertOne({"UserName":"Jace","UserMailId":"Jace@gmail.com"});{
"acknowledged" : true, "insertedId" : ObjectId("5e8f1d1cd1d72c4545cb867b")
}このコレクションには3件のドキュメントが登録されました。「John」「Chris」「Jace」というユーザー名と、それぞれ対応するメールアドレスが格納されています。
登録済みドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo554.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e8f1cfed1d72c4545cb8679"), "UserName" : "John", "UserMailId" : "John@gmail.com" }
{ "_id" : ObjectId("5e8f1d0cd1d72c4545cb867a"), "UserName" : "Chris", "UserMailId" : "Chris@gmail.com" }
{ "_id" : ObjectId("5e8f1d1cd1d72c4545cb867b"), "UserName" : "Jace", "UserMailId" : "Jace@gmail.com" }「LIKE」検索の実装クエリ
ここからが本題です。「UserName」または「UserMailId」フィールドに「J」という文字を含むドキュメントを検索するには、$or演算子と正規表現を組み合わせて以下のようなクエリを実行します。
> db.demo554.find({
... "$or": [
... { "UserName": /J/ },
...
... { "UserMailId": /J/ }
... ]
... }
... );実行結果
{ "_id" : ObjectId("5e8f1cfed1d72c4545cb8679"), "UserName" : "John", "UserMailId" : "John@gmail.com" }
{ "_id" : ObjectId("5e8f1d1cd1d72c4545cb867b"), "UserName" : "Jace", "UserMailId" : "Jace@gmail.com" }結果を見ると、「Chris」のドキュメントは除外され、「John」と「Jace」のみが返されました。これはどちらもユーザー名とメールアドレスに「J」が含まれているためです。
ポイント解説
- /J/:文字列の中に「J」が含まれていればマッチします(位置は問いません)。
- /^J/:「J」で始まる文字列だけにマッチさせたい場合は、先頭にキャレット「^」を付けます。
- /J$/:逆に「J」で終わる文字列に限定したい場合は、末尾に「$」を付けます。
- /J/i:大文字・小文字を区別せずに検索したい場合は、末尾にオプション「i」を追加します。
このように、MongoDBでは正規表現を活用することで、SQLのLIKE句に相当する柔軟なパターンマッチング検索を簡単に実装できます。
-
MongoDBで大文字と小文字を区別せずに特定の名前のドキュメントを取得するクエリ
MongoDBで、フィールド値の大文字と小文字の違いに関係なくドキュメントを検索したい場合には、$regex演算子を使用します。この記事では、「David」という名前を持つドキュメントを、大文字・小文字を問わず検索する方法を解説します。サンプルコレクションの作成まず、デモ用のコレクションにドキュメントを挿入します。意図的に「david」「DAVID」「David」など、大文字と小文字が異なる名前を登録している点に注目してください。> db.demo700.insertOne( { details: [ { Name:david }]}); { acknowledged : true
-
特定のFirstNameとLastNameを持つドキュメントを検索するMongoDBクエリの書き方
はじめにMongoDBで特定のFirstNameとLastNameを持つドキュメントを検索するには、$and演算子と$in演算子を組み合わせて使用します。この記事では、実際のコード例を通して、find()メソッドでこの条件を実装する方法を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。> db.demo692.insertOne({FirstName:"Chris","LastName":"Brown"}); { "acknowl