MongoDBでフィールドに特定の文字列が含まれているか確認する方法($regexの使い方)
MongoDBでフィールドの値に特定の文字列が含まれているかどうかを調べたい場合は、$regex演算子を使用します。SQLにおけるLIKE '%文字列%'に相当する機能で、部分一致検索を簡単に実現できます。
基本構文
以下が$regex演算子を使った基本的な構文です。
db.yourCollectionName.findOne({ "yourFieldName": { $regex: ".*yourValue.*" } });パターン「.*yourValue.*」は、検索対象の文字列(yourValue)がフィールド値のどこかに含まれていればマッチすることを意味します。前後の.*は「任意の文字が0回以上繰り返す」という正規表現です。
サンプルコレクションの作成
実際に動作を確認するため、ドキュメントを含むコレクションを作成しましょう。以下のクエリを実行します。
> db.checkFieldContainsStringDemo.insertOne({ "Id": 1, "Name": "John" });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77d762fc4e719b197a12ed")
}
> db.checkFieldContainsStringDemo.insertOne({ "Id": 2, "Name": "Johnson" });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77d76bfc4e719b197a12ee")
}
> db.checkFieldContainsStringDemo.insertOne({ "Id": 3, "Name": "Carol" });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77d774fc4e719b197a12ef")
}
> db.checkFieldContainsStringDemo.insertOne({ "Id": 4, "Name": "Mike" });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77d77cfc4e719b197a12f0")
}
> db.checkFieldContainsStringDemo.insertOne({ "Id": 5, "Name": "Sam" });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77d784fc4e719b197a12f1")
}
> db.checkFieldContainsStringDemo.insertOne({ "Id": 6, "Name": "Larry" });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77d78cfc4e719b197a12f2")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.checkFieldContainsStringDemo.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5c77d762fc4e719b197a12ed"), "Id" : 1, "Name" : "John" }
{ "_id" : ObjectId("5c77d76bfc4e719b197a12ee"), "Id" : 2, "Name" : "Johnson" }
{ "_id" : ObjectId("5c77d774fc4e719b197a12ef"), "Id" : 3, "Name" : "Carol" }
{ "_id" : ObjectId("5c77d77cfc4e719b197a12f0"), "Id" : 4, "Name" : "Mike" }
{ "_id" : ObjectId("5c77d784fc4e719b197a12f1"), "Id" : 5, "Name" : "Sam" }
{ "_id" : ObjectId("5c77d78cfc4e719b197a12f2"), "Id" : 6, "Name" : "Larry" }$regexで文字列を検索する
それでは、フィールドに特定の文字列が含まれているかを確認してみましょう。ここでは「Johnson」という文字列をNameフィールドから検索します。
> db.checkFieldContainsStringDemo.findOne({ "Name": { $regex: ".*Johnson.*" } });実行結果は以下の通りです。「Johnson」を含むドキュメントのみが取得できました。
{
"_id" : ObjectId("5c77d76bfc4e719b197a12ee"),
"Id" : 2,
"Name" : "Johnson"
}大文字・小文字を区別せずに検索するには
デフォルトでは$regexは大文字・小文字を区別します。区別せずに検索したい場合は、オプション「i」を指定します。
> db.checkFieldContainsStringDemo.findOne({ "Name": { $regex: ".*johnson.*", $options: "i" } });補足:パフォーマンスに関する注意点
$regexによる部分一致検索は、先頭が.*で始まるパターンの場合、インデックスを利用できないためコレクションのフルスキャンが発生します。大規模なコレクションでは処理が遅くなる可能性があるため注意が必要です。前方一致であれば「^yourValue」のように先頭アンカー付きのパターンを使うことでインデックスが活用されます。
また、MongoDB 4.2以降では、より直感的に記述できる$regexLike相当の書き方として、{ field: { $regex: /pattern/ } }のように正規表現リテラルを直接指定する方法も一般的に使われています。
-
Swiftで文字列に特殊文字が含まれているか判定する2つの方法
Swiftで文字列に特殊文字が含まれているかどうかを確認したい場合、if文やswitch文による条件分岐でも実現できますが、その場合は膨大な条件式を記述する必要があり、コーディングにも実行速度にも大きな負担となってしまいます。そこで本記事では、正規表現を使う方法と、Swift標準のCharacterSetを活用する方法の2通りを、具体的なコード例とともにわかりやすく解説します。 方法1:正規表現を使って判定する まずはString型のextensionを作成し、特殊文字の有無を判定するプロパティを追加しましょう。 extension String { var containsSpeci
-
Swiftで文字列が別の文字列を含んでいるか確認する方法
Swiftである文字列に別の文字列が含まれているかどうかを確認するには、2つの異なる文字列が必要です。1つは検索対象となる文字列、もう1つはその中に特定の文字列が含まれているかを調べる元となる文字列です。 ここでは、確認したい文字列を「point」、全体の文字列を「TutorialsPoint」、そして別の文字列として「one two three」を使用して説明します。Playgroundでこれらの文字列を使って実際に確認してみましょう。 この確認は、以下に示す2つの方法で行うことができます。まずは3つの異なる文字列を作成します。 var completeStr1 = Tutorials po