MongoDBの$regex(正規表現)で入力値に類似した名前を検索する方法
MongoDBでは、$regex 演算子を使用することで、ユーザーが入力した名前に類似したドキュメントを柔軟に検索できます。さらに $options に 'i' を指定すれば、大文字と小文字を区別しない部分一致検索も可能です。
この記事では、実際にコレクションを作成し、正規表現によるあいまい検索を行う手順をサンプルコード付きで解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って、名前情報を持つドキュメントをコレクションに登録します。
> db.demo514.insertOne({"Information":{"FullName":"John Doe"}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e885116987b6e0e9d18f58c")
}
> db.demo514.insertOne({"Information":{"FullName":"John Smith"}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e88515e987b6e0e9d18f58d")
}
> db.demo514.insertOne({"Information":{"FullName":"john doe"}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e885169987b6e0e9d18f58e")
}
> db.demo514.insertOne({"Information":{"FullName":"Chris Brown"}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e88516f987b6e0e9d18f58f")
}ここでは、「John Doe」「John Smith」「john doe」(小文字)「Chris Brown」の4件を登録しました。同じ名前でも大文字・小文字が異なるデータが含まれている点に注目してください。
2. 登録済みドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo514.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e885116987b6e0e9d18f58c"), "Information" : { "FullName" : "John Doe" } }
{ "_id" : ObjectId("5e88515e987b6e0e9d18f58d"), "Information" : { "FullName" : "John Smith" } }
{ "_id" : ObjectId("5e885169987b6e0e9d18f58e"), "Information" : { "FullName" : "john doe" } }
{ "_id" : ObjectId("5e88516f987b6e0e9d18f58f"), "Information" : { "FullName" : "Chris Brown" } }3. $regexを使った類似名の検索クエリ
次に、入力値「John Doe」に類似した名前を検索するクエリを見てみましょう。ネストされたフィールド Information.FullName に対して $regex を適用し、$options: 'i' で大文字・小文字を無視しています。
> db.demo514.find({'Information.FullName': {$regex: "John Doe", $options: 'i'}});このクエリを実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5e885116987b6e0e9d18f58c"), "Information" : { "FullName" : "John Doe" } }
{ "_id" : ObjectId("5e885169987b6e0e9d18f58e"), "Information" : { "FullName" : "john doe" } }結果のポイント
出力結果を見ると、「John Doe」と完全一致するドキュメントに加えて、小文字で表記された「john doe」のドキュメントも取得できています。これは $options: 'i'(大文字・小文字を区別しない設定)のおかげです。
一方、「John Smith」や「Chris Brown」はパターンに一致しないため、結果には含まれません。このように $regex を使えば、表記ゆれを含むあいまいな名前検索を簡単に実装できます。
まとめ
- MongoDBの
$regex演算子を使うと、フィールド値の部分一致検索が可能になる。 $options: 'i'を指定することで、大文字・小文字の違いを無視した検索ができる。- ネストされたフィールドに対しても「親フィールド.子フィールド」の形式で正規表現検索を適用できる。
ユーザー検索や名寄せ処理など、入力値に近いデータを取り出したい場面で非常に役立つテクニックなので、ぜひ活用してみてください。
-
Javaの正規表現:\Aメタ文字で文字列の先頭に一致させる方法
Javaの正規表現におけるメタ文字「\A」は、入力文字列全体の先頭に一致します。「^」と似た働きをしますが、「^」はMULTILINEモード時に各行の先頭にも一致するのに対し、「\A」は常に文字列全体の先頭のみに一致するという違いがあります。 例1:\Aを使った基本的なマッチング 次のJavaプログラムでは、パターン「\AHi」を使って、入力文字列が「Hi」という文字列で始まっているかどうかを確認しています。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample
-
【Java】正規表現の\Aメタ文字とは?文字列の先頭にマッチさせる方法を解説
\Aメタ文字とはJavaの正規表現におけるメタ文字「\A」は、入力文字列全体の先頭にマッチします。よく使われる「^」と似ていますが、「^」はMULTILINEモード有効時に各行の先頭にもマッチするのに対し、「\A」はモードに関係なく常に文字列全体の先頭だけにマッチする点が異なります。例1:文字列の先頭をマッチさせる次のJavaプログラムでは、パターン「\AHi」を使って、入力文字列の先頭に「Hi」という文字列があるかどうかを確認しています。import java.util.regex.Matcher; import java.util.regex.Pattern; public class