MongoDB 正規表現
正規表現は、単一の文字列を使用して、特定の構文規則に一致する一連の文字列を記述・照合するものです。
多くのプログラミング言語が、正規表現を使用した文字列操作をサポートしています。
MongoDB は$regex演算子を使用して、一致する文字列の正規表現を設定します。
MongoDB は PCRE (Perl Compatible Regular Expression) を正規表現言語として使用します。
全文検索とは異なり、正規表現を使用する場合、追加の設定は一切必要ありません。
以下を考慮してくださいpostsコレクションのドキュメント構造です。このドキュメントには記事の内容とタグが含まれています。
{
"post_text": "enjoy the mongodb articles on サンプル",
"tags": [
"mongodb",
"サンプル"
]
}
正規表現を使用する
次のコマンドは、正規表現を使用して サンプル という文字列を含む記事を検索します。
>db.posts.find({post_text:{$regex:"サンプル"}})
上記のクエリは次のようにも記述できます:
>db.posts.find({post_text:/サンプル/})
大文字と小文字を区別しない正規表現
検索で大文字と小文字を区別する必要がない場合は、$options を $i に設定できます。
次のコマンドは、大文字と小文字を区別せずに文字列 サンプル を検索します。
>db.posts.find({post_text:{$regex:"サンプル",$options:"$i"}})
コレクション内の サンプル という文字列を含むすべてのデータが、大文字と小文字を区別せずに返されます。
{
"_id" : ObjectId("53493d37d852429c10000004"),
"post_text" : "hey! this is my post on サンプル",
"tags" : [ "サンプル" ]
}
配列要素での正規表現の使用
配列フィールドでも正規表現を使用して内容を検索できます。これはタグの実装に非常に便利です。run で始まるタグデータ(ru、run、サンプル)を検索する必要がある場合は、次のコードを使用できます:
>db.posts.find({tags:{$regex:"run"}})
正規表現クエリの最適化
- ドキュメントのフィールドにインデックスが設定されている場合、インデックスを使用すると、正規表現でマッチングしてすべてのデータを検索するよりもクエリ速度が速くなります。
- 正規表現がプレフィックス式の場合、一致するすべてのデータは指定されたプレフィックス文字列で始まります。例: ^tut クエリ文は tut で始まる文字列を検索します。
ここで正規表現を使用する際、注意すべき点が2つあります:
正規表現内で変数を使用する場合。必ず eval を使用して組み合わせた文字列を変換してください。文字列を単純に連結して式に渡すことはできません。そうしないとエラーは表示されず、結果が空になるだけです。例は次のとおりです:
var name=eval("/" + 变量值key +"/i");
以下は、title キーワードを含むあいまい検索を、大文字と小文字を区別せずに行う例です:
title:eval("/"+title+"/i") // 等同于 title:{$regex:title,$Option:"$i"}
その他の拡張