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でオートコンプリート機能を実装しながら、異なるパターンタイプのパフォーマンスへの影響を認識できます。

試してみる — SQL to MongoDB Query

フルツールを開く