MongoDBでSQLのLIKE句に相当する検索を行う方法|$regex演算子の使い方を解説
SQLのLIKE句のような部分一致検索をMongoDBで実現するには、「$regex」演算子を使用します。$regexは正規表現によるパターンマッチングを可能にする演算子で、SQLのあいまい検索と同等の処理を柔軟に行えます。
この記事では、実際にコレクションを作成しながら、$regex演算子の基本的な使い方をわかりやすく解説します。
1. テスト用コレクションの作成
まずは動作確認のためのコレクションを作成し、サンプルドキュメントを挿入します。insertOne()メソッドを使って、以下のようにデータを登録していきましょう。
> db.sqlLikeDemo.insertOne({"UserName":"John Smith","UserAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e124afe5c1d2279d6a5")
}
> db.sqlLikeDemo.insertOne({"UserName":"John Doe","UserAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e264afe5c1d2279d6a6")
}
> db.sqlLikeDemo.insertOne({"UserName":"Chris Williams","UserAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e404afe5c1d2279d6a7")
}
> db.sqlLikeDemo.insertOne({"UserName":"Robert Taylor","UserAge":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e4d4afe5c1d2279d6a8")
}
> db.sqlLikeDemo.insertOne({"UserName":"John Brown","UserAge":27});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e6c4afe5c1d2279d6a9")
}
> db.sqlLikeDemo.insertOne({"UserName":"Mike Brown","UserAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e794afe5c1d2279d6aa")
}
> db.sqlLikeDemo.insertOne({"UserName":"Larry Smith","UserAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e8c4afe5c1d2279d6ab")
}2. 登録済みドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.sqlLikeDemo.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5c912e124afe5c1d2279d6a5"),
"UserName" : "John Smith",
"UserAge" : 24
}
{
"_id" : ObjectId("5c912e264afe5c1d2279d6a6"),
"UserName" : "John Doe",
"UserAge" : 21
}
{
"_id" : ObjectId("5c912e404afe5c1d2279d6a7"),
"UserName" : "Chris Williams",
"UserAge" : 22
}
{
"_id" : ObjectId("5c912e4d4afe5c1d2279d6a8"),
"UserName" : "Robert Taylor",
"UserAge" : 26
}
{
"_id" : ObjectId("5c912e6c4afe5c1d2279d6a9"),
"UserName" : "John Brown",
"UserAge" : 27
}
{
"_id" : ObjectId("5c912e794afe5c1d2279d6aa"),
"UserName" : "Mike Brown",
"UserAge" : 23
}
{
"_id" : ObjectId("5c912e8c4afe5c1d2279d6ab"),
"UserName" : "Larry Smith",
"UserAge" : 24
}3. $regex演算子でSQLのLIKE相当の検索を実行
それでは本題です。「UserName」フィールドに「John」という文字列を含むレコードを検索するクエリを見てみましょう。これはSQLでいうところのLIKE '%John%'に相当します。
> db.sqlLikeDemo.find({"UserName":{"$regex": "John"}}).pretty();実行結果は以下の通りです。
{
"_id" : ObjectId("5c912e124afe5c1d2279d6a5"),
"UserName" : "John Smith",
"UserAge" : 24
}
{
"_id" : ObjectId("5c912e264afe5c1d2279d6a6"),
"UserName" : "John Doe",
"UserAge" : 21
}
{
"_id" : ObjectId("5c912e6c4afe5c1d2279d6a9"),
"UserName" : "John Brown",
"UserAge" : 27
}「John」を含む3件のドキュメントだけが抽出されました。このように、$regex演算子を使えばSQLのLIKE句と同じ感覚で部分一致検索が行えます。
4. 応用:正規表現パターンで検索条件を細かく制御する
$regexは正規表現をそのまま使えるため、SQLのLIKEよりもさらに柔軟な検索が可能です。
- 前方一致(SQLの
LIKE 'John%'相当):{"UserName": {"$regex": "^John"}} - 後方一致(SQLの
LIKE '%Smith'相当):{"UserName": {"$regex": "Smith$"}} - 大文字・小文字を区別しない検索:
{"UserName": {"$regex": "/john/i"}}
たとえば^Johnと指定すれば「John Smith」「John Doe」「John Brown」はヒットしますが、名前の途中に「John」が含まれる別のパターンは除外されます。
まとめ
MongoDBでSQLのLIKE句に相当する検索を行いたい場合は、$regex演算子を使用します。単純な部分一致から、正規表現による高度なパターンマッチングまで対応できるため、RDBMSからの移行時やあいまい検索の実装時に非常に便利です。ただし、先頭がワイルドカードになるような検索(%xxx)はインデックスを利用できずパフォーマンスに影響する場合があるため、大規模データを扱う際は注意が必要です。
-
MySQLのUNHEX()に相当するPHP関数とは?hex2bin()の使い方を解説
PHPにおけるMySQLのUNHEX()相当の関数MySQLのUNHEX()関数と同じ処理をPHPで行いたい場合は、hex2bin()関数を使用します。この関数は、16進数形式の文字列をバイナリデータ(元の文字列)に変換するもので、まさにMySQLのUNHEX()に相当する機能を持っています。hex2bin()の基本構文構文は以下の通りです。$anyVariableName = hex2bin(yourHexadecimalValue);引数には16進数の文字列を指定し、戻り値として変換後のバイナリデータが返されます。PHPでの実装例実際にhex2bin()を使用したサンプルコードを見てみまし
-
MatplotlibでMATLABのsurf(x, y, z, c)と同じ効果を実現する方法
MATLABの surf(x, y, z, c) と同じような3DサーフェスプロットをMatplotlibで描画する方法を、具体例を通して解説します。手順は以下の通りです。図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。新しい図を作成するか、既存の図をアクティブにします。サブプロット配置の一部として、図に ax(3D軸)を追加します。Numpyを使用して r、u、v、x、y、z のデータポイントを作成します。サーフェスプロットを作成します。図を表示するには、show() メソッドを使用します。コード例import matplotlib.pyplot as plt