MongoDBで整数値に対して正規表現(Regex)検索を実行する方法
MongoDBでは、通常の正規表現検索は文字列フィールドを対象とするため、整数値(数値型)のフィールドに対して正規表現のような前方一致検索を行いたい場合は工夫が必要です。そのようなケースでは $where 演算子を使用することで解決できます。
この記事では、$where 演算子を使って整数値に対して正規表現検索を実行する具体的な手順を、サンプルコードとともにわかりやすく解説します。
$where演算子を使った基本構文
整数値に対して正規表現検索を行う場合の基本的な構文は以下の通りです。
db.yourCollectionName.find({ $where:
"/^yourIntegerPatternValue.*/.test(this.yourFieldName)" });この構文では、JavaScriptの RegExp.test() メソッドを利用し、指定したパターンが対象フィールドの値にマッチするかどうかを判定しています。
サンプルコレクションの作成
それでは、実際に動作を確認するために、ドキュメントを含むコレクションを作成しましょう。以下のクエリで「regExpOnIntegerDemo」というコレクションに複数のドキュメントを挿入します。
> db.regExpOnIntegerDemo.insertOne({"StudentId":2341234});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c70370c75eb1743ddddce21")
}
> db.regExpOnIntegerDemo.insertOne({"StudentId":123234});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c70371175eb1743ddddce22")
}
> db.regExpOnIntegerDemo.insertOne({"StudentId":9871234});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c70371875eb1743ddddce23")
}
> db.regExpOnIntegerDemo.insertOne({"StudentId":2345612});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c70372275eb1743ddddce24")
}
> db.regExpOnIntegerDemo.insertOne({"StudentId":1239812345});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c70372975eb1743ddddce25")
}登録済みドキュメントの確認
find() メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。以下のクエリを実行してみましょう。
> db.regExpOnIntegerDemo.find().pretty();
実行結果は次のようになります。
{ "_id" : ObjectId("5c70370c75eb1743ddddce21"), "StudentId" : 2341234 }
{ "_id" : ObjectId("5c70371175eb1743ddddce22"), "StudentId" : 123234 }
{ "_id" : ObjectId("5c70371875eb1743ddddce23"), "StudentId" : 9871234 }
{ "_id" : ObjectId("5c70372275eb1743ddddce24"), "StudentId" : 2345612 }
{ "_id" : ObjectId("5c70372975eb1743ddddce25"), "StudentId" : 1239812345 }整数値に対する正規表現検索の実行
準備ができたら、いよいよ整数値に対して正規表現検索を実行します。ここでは「123」で始まる StudentId を持つドキュメントを検索してみましょう。
> db.regExpOnIntegerDemo.find({ $where: "/^123.*/.test(this.StudentId)" });実行結果は以下の通りです。「123」から始まる値を持つ2件のドキュメントのみが取得できていることがわかります。
{ "_id" : ObjectId("5c70371175eb1743ddddce22"), "StudentId" : 123234 }
{ "_id" : ObjectId("5c70372975eb1743ddddce25"), "StudentId" : 1239812345 }注意点:パフォーマンスへの影響
$where 演算子は各ドキュメントに対してJavaScriptを実行するため、インデックスを活用できず、大規模なコレクションではパフォーマンスが大きく低下する可能性があります。本番環境で頻繁に使用するクエリの場合は、検索用の文字列フィールドを別途用意しておくか、集計パイプラインの $toString や $regexMatch を組み合わせる方法も検討するとよいでしょう。
-
【MongoDB】ネストされたドキュメント内の値を検索する方法($unwind・$match活用)
MongoDBでネストされたドキュメントの値を検索する方法 MongoDBでネストされた配列内の値を検索するには、集計パイプライン(aggregate())の $match ステージを使用します。まず、サンプルとなるドキュメントを含むコレクションを作成しましょう。 > db.demo648.insertOne( ... { ... StudentInformation: ... [ ... &nbs
-
MongoDBのfindOne()で正規表現($regex)を使う方法
MongoDBのfindOne()メソッドは、コレクションに対して指定したクエリ条件を満たすドキュメントを1件だけ返します。条件に合致する最初のドキュメントのみが必要な場合に便利なメソッドです。この記事では、findOne()と正規表現($regex)を組み合わせて使う方法を、実際のコード例とともに解説します。サンプルコレクションの作成まずは、ドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使って、3つのドキュメントを登録します。> db.demo655.insertOne({subject:MySQL}); { acknowledged : tr