MongoDBで特定の文字列を含むドキュメントを検索する方法($regexの使い方)
MongoDBで特定の文字列を含むドキュメントを見つける方法
MongoDBで特定の文字列が含まれるドキュメントを検索したい場合、find()メソッドと$regex演算子を組み合わせて使用します。$regexを使うことで、部分一致や大文字・小文字を区別しない柔軟な検索が可能になります。
この記事では、実際のコレクションを作成しながら、特定の文字列を含むドキュメントを抽出する手順を解説します。
1. テスト用コレクションとドキュメントの作成
まず、insertOne()メソッドを使ってサンプルコレクション「demo597」にドキュメントを挿入します。
> db.demo597.insertOne({"Name":"John Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e947ae3f5f1e70e134e2690")
}
> db.demo597.insertOne({"Name":"John Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e947ae8f5f1e70e134e2691")
}
> db.demo597.insertOne({"Name":"Chris Brown"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e947aeff5f1e70e134e2692")
}
> db.demo597.insertOne({"Name":"Adam Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e947afff5f1e70e134e2693")
}上記のコマンドにより、「John Doe」「John Smith」「Chris Brown」「Adam Smith」という4つの名前を持つドキュメントが登録されました。
2. 登録された全ドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo597.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e947ae3f5f1e70e134e2690"), "Name" : "John Doe" }
{ "_id" : ObjectId("5e947ae8f5f1e70e134e2691"), "Name" : "John Smith" }
{ "_id" : ObjectId("5e947aeff5f1e70e134e2692"), "Name" : "Chris Brown" }
{ "_id" : ObjectId("5e947afff5f1e70e134e2693"), "Name" : "Adam Smith" }3. $regexを使って特定の文字列を含むドキュメントを検索する
ここからが本題です。次のクエリでは、Nameフィールドに「smith」という文字列(大文字小文字を問わず)を含むドキュメントを検索しています。
> db.demo597.find({Name:{$regex:/smith/i}} );ポイントは正規表現パターンの末尾にある「i」フラグです。これを指定すると、大文字と小文字を区別せずに検索できます。そのため、先頭が大文字の「Smith」もマッチします。
実行結果は以下の通りです。
{ "_id" : ObjectId("5e947ae8f5f1e70e134e2691"), "Name" : "John Smith" }
{ "_id" : ObjectId("5e947afff5f1e70e134e2693"), "Name" : "Adam Smith" }補足:$regexのその他の活用例
$regexはさまざまなパターンマッチングに対応しています。
- 前方一致:
{$regex: /^John/}— 「John」で始まる値を検索 - 後方一致:
{$regex: /Smith$/}— 「Smith」で終わる値を検索 - 完全一致:
{$regex: /^John Doe$/}— 値全体が一致するものだけを検索
また、MongoDB 4.4以降では、$regexFindや$regexMatchといった集計演算子も利用できるため、より高度なテキスト処理が必要な場合はそちらも検討するとよいでしょう。
まとめ
MongoDBで特定の文字列を含むドキュメントを検索するには、find()メソッドに$regex演算子を指定するのが基本です。「i」オプションを付けると大文字・小文字を区別せずに検索でき、実務でのデータ抽出に非常に便利です。ただし、大量のデータに対して正規表現検索を行うとインデックスが効かない場合があるため、パフォーマンスが気になる場合は前方一致(^)を活用し、インデックスを有効に活用することをおすすめします。
-
MongoDBのfind()クエリでネストされたドキュメントを取得する方法
MongoDBでネストされたドキュメント(入れ子になったサブドキュメントや配列内のオブジェクト)から値を取得するには、「ドット表記(dot notation)」を使用します。この記事では、サンプルコレクションを作成し、find()クエリを使ってネストされたデータを検索する具体的な手順を解説します。 サンプルコレクションの作成 まず、insert()メソッドを使ってドキュメントを含むコレクションを作成しましょう。 > db.demo591.insert([ ... { "Name": "John", "Age": 23 },
-
MongoDBドキュメントから特定の値をフィルタリングする方法
MongoDBドキュメントから特定の値をフィルタリングする方法MongoDBでドキュメント内の配列から特定の値を抽出したい場合は、集計パイプラインで $filter を使用します。この記事では、実際にコレクションを作成し、特定の条件に一致する要素だけをフィルタリングする手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを含むドキュメントを持つコレクションを作成します。 db.demo751.insertOne( ... { ... _id: 101, ... details: [