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"}   
その他の拡張