SQL LIKEをMongoDBの$regexでパターンマッチングに変換する
SQL LIKEパターンの%と_ワイルドカードが柔軟な文字列マッチングのためにMongoDBの$regex式に変換される方法を学びます。
Filtering
詳細な説明
LIKEから$regexへ
SQLのLIKE演算子は2つのワイルドカードでパターンマッチングを行います:%(任意の文字列)と_(任意の1文字)。MongoDBは同じ目的で正規表現を使用した$regexを使用します。
SQLの例
SELECT * FROM users
WHERE name LIKE 'John%'
生成されるMongoDBクエリ
db.users.find({
name: { $regex: /John.*/i }
})
ワイルドカード変換表
| SQL LIKEパターン | MongoDB Regex | マッチ対象 |
|---|---|---|
'John%' |
/John.*/ |
"John"で始まる |
'%smith' |
/.*smith/ |
"smith"で終わる |
'%admin%' |
/.*admin.*/ |
"admin"を含む |
'J_n' |
/J.n/ |
"J" + 任意の1文字 + "n" |
'%test_' |
/.*test./ |
"test"を含み + もう1文字 |
大文字小文字の区別
コンバーターは大文字小文字を区別しないマッチングのためにiフラグを追加します。これは多くのSQLデータベース(MySQL、SQL Server)でのLIKEのデフォルト動作に合わせています。PostgreSQLのLIKEはデフォルトで大文字小文字を区別します。大文字小文字を区別しないマッチングにはILIKEを使用します。
NOT LIKE
SQLのNOT LIKEはMongoDBの$not演算子で$regexをラップして変換されます:
db.users.find({
name: { $not: { $regex: /admin.*/i } }
})
パフォーマンスへの影響
リテラルプレフィックスで始まらないregexクエリ(つまり% / .*で始まるパターン)は、MongoDBでインデックスを効率的に使用できず、コレクションスキャンがトリガーされます。大規模なデータセットでの本番使用では、MongoDBのテキストインデックスやAtlas Searchの全文検索機能の使用を検討してください。
ユースケース
Webアプリケーションの入力中検索機能は、一般的にLIKE 'prefix%'クエリを使用します。regex変換を理解することで、開発者はMongoDBでオートコンプリート機能を実装しながら、異なるパターンタイプのパフォーマンスへの影響を認識できます。