Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

regex (MongoDB Search 演算子)

regex

regexqueryフィールドを正規表現として解釈します。 regexはタームレベルの演算子であり、 queryフィールドは分析されません。

Tip

  • アナライザ。

  • 分析フィールドの例。

注意

regex演算子で使用できる正規表現言語は、 PCREライブラリの限定的なサブセットです。

詳細については、クラス正規表現 のドキュメントを参照してください。

regex の構文は次のとおりです。

1{
2 $search: {
3 "index": <index name>, // optional, defaults to "default"
4 "regex": {
5 "query": "<search-string>",
6 "path": "<field-to-search>",
7 "allowAnalyzedField": <boolean>,
8 "score": <options>
9 }
10 }
11}

regex では、次の用語を使用してクエリを作成します。

フィールド
タイプ
説明
必要性
default

query

文字列または複数の文字列の配列

検索する文字列または複数の文字列。

はい

path

文字列または複数の文字列の配列

検索対象となるインデックス付きフィールド。ワイルドカード パスを指定して検索することもできます。

はい

allowAnalyzedField

ブール値

分析対象フィールドに対してクエリを実行する場合は、 true に設定する必要があります。

no

false

score

オブジェクト

一致する検索タームの結果に割り当てるスコア。 次の選択肢があります。

  • boost: 結果のスコアに指定された数値を掛けます。

  • constant: 結果のスコアを指定された数値に置き換えます。

  • function: 結果のスコアを指定された式で置き換えます。

no

regex はタームレベルの演算子であり、 queryフィールドは分析されないことを意味します。 正規表現検索はキーワード アナライザと連携します。フィールドは一度に 1 単語ずつインデックス化されるためです。 大文字と小文字を区別する検索をする場合は、デフォルトのアナライザである標準 アナライザを使用しないでください。 standardアナライザはすべてのタームを大文字と小文字であるため、 代わりに別のアナライザを指定してください。

allowAnalyzedFieldオプションをtrueに設定することで、 regex演算子を使用して分析フィールドで検索を実行することは可能ですが、予期しない結果が生じる可能性があります。

キーワード アナライザーでインデックス付けされたフィールドで .*Star Trek.* を検索すると、任意のコンテキストでフィールドに文字列 Star Trek が含まれるすべてのドキュメントが見つかります。標準アナライザでフィールドにインデックス付けされた .*Star Trek.* を検索しても何も見つかりません。これは、 StarTrek の間にスペースがあり、インデックスにスペースが含まれていないためです。

MongoDB Searchregex 演算子は、 Perl互換正規表現とは異なる Lucene 正規式エンジンを使用します。

次の文字は、正規表現で使用される場合、演算子として予約されます。

. ? + * | { } [ ] ( ) < > " \ @ #

上記の文字を文字通り使用するには、その前に\文字を付けます。

who\? に一致します

mongoshまたはドライバーとともにエスケープ文字を使用する場合は、エスケープ文字の前にdoubleバックスラッシュを使用する必要があります。

リテラル アスタリスクを含む任意の文字列を検索するワイルドカード式を作成するには、次の式を使用します。

"*\\**"

最初と最後のアスタリスクは任意の文字に一致するワイルドカードとして機能し、\\* はリテラルのアスタリスクに一致します。

注意

次の式を使用して、リテラルのバックスラッシュをエスケープします。

"*\\\*"
演算子
説明

.

任意の文字と一致します。

x.z matches "xyz", "xaz", etc.

?

先行する文字は任意であり、1 回以上出現する場合は一致します。

xyz? "xy" と "xyz" に一致

+

先行する文字は 1 回以上出現する場合は一致します。

xy+ は "xy"、"xyy"、"xyy" などに一致します。

*

先行する文字は、一定回出現する場合は一致します。

xyz* は "xy"、"xyz"、"xyz" などに一致します。

|

OR 演算子。 式は、| 演算子のどちらかにある 2 つのパターンのいずれかが一致する場合に一致します。

abc|xyz "abc" または "xyz" に一致します

{<number>}

先行する文字は、"number"<number> 回完全に出現する場合は一致します。

xyz{3} "xyzz" に一致します

()

括弧内の文字は、マッチング目的で単一の単位として扱われます。

xyz(abc)[2] "xyzabc" に一致します

[]

角括弧で囲まれた任意の文字と一致します。

先頭に^を追加すると、角括弧で囲まれた文字を除くすべての文字と一致します。

角括弧内では、 -が最初の文字であるか、 \でエスケープされている場合を除き、 -は範囲を示します。

[xyz] matches "x", "y", and "z"
[^abc] matches any character except "a", "b", or "c"
[a-d] matches "a", "b", "c", or "d"
[0-9] matches any numeric character from 0 through 9

<>

数値範囲に一致します。

<1-3> は "1"、"2"、および "3" に一致します

#

空の言語演算子。 #演算子は、空の string を含むどの string とも一致しません。

#|xyz が "xyz" と一致し、それ以外のものと一致しない

regex は、アンカー演算子をサポートしていません。例では、次の演算子はサポートされていません。

  • ^、これは行の先頭に一致します。

  • $行の末尾に一致するものです。

タームを一致させるには、正規表現が文字列全体と一致する必要があります。

次の例では、 キーワードアナライザを使用するカスタムインデックス定義を持つ sample_mflixデータベースの moviesコレクションを使用します。クラスターにサンプルデータセットがある場合は、moviesコレクションにMongoDB Searchインデックスを作成し、クラスターで例クエリを実行できます。

次のインデックス定義は、キーワード アナライザを使用して、movies コレクションの title フィールドにインデックスを作成します。

1{
2 "mappings": {
3 "fields": {
4 "title": {
5 "analyzer": "lucene.keyword",
6 "type": "string"
7 },
8 "genres": {
9 "type": "token"
10 }
11 }
12 }
13}

次の例では、正規表現 .* を使用して、title 内のどこかに summer という語句を含む映画タイトルを検索し、条件に一致する映画の数をジャンルごとに返します。

1db.movies.aggregate([
2 {
3 "$searchMeta": {
4 "facet": {
5 "operator": {
6 "regex": {
7 "path": "title",
8 "query": ".*summer.*"
9 }
10 },
11 "facets": {
12 "genresFacet": {
13 "type": "string",
14 "path": "genres"
15 }
16 }
17 }
18 }
19 }
20])
[
{
count: { lowerBound: Long('6') },
facet: {
genresFacet: {
buckets: [
{ _id: 'Comedy', count: Long('5') },
{ _id: 'Fantasy', count: Long('3') },
{ _id: 'Romance', count: Long('3') },
{ _id: 'Drama', count: Long('2') },
{ _id: 'Horror', count: Long('1') },
{ _id: 'Mystery', count: Long('1') }
]
}
}
}
]

次の例では、すべてのtitleフィールドで、 Seattleという単語で終わる映画タイトルを検索します。 (.*)正規表現は、任意の数の文字と一致します。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": "(.*) Seattle"
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])
[ { title: 'Sleepless in Seattle' }, { title: 'Battle in Seattle' } ]

次の例では、正規表現[0-9]{2} (.){4}sを使用して、2 桁の数字とそれに続くスペースで始まり、5 文字の単語でsで終わる映画タイトルを検索します。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": "[0-9]{2} (.){4}s"
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])
[
{ title: '20 Dates' },
{ title: '25 Watts' },
{ title: '21 Grams' },
{ title: '13 Lakes' },
{ title: '18 Meals' },
{ title: '26 Years' },
{ title: '99 Homes' },
{ title: '45 Years' }
]

次の例では、正規式.*Toy Story.* を使用して、Toy Story というフレーズを含むすべての映画タイトルを検索します。検索フィールドでは キーワードアナライザが使用されているため、正規表現 は単語間のスペースを含め、保存されているフレーズと完全に一致します。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": ".*Toy Story.*"
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])
[
{ title: 'Toy Story' },
{ title: 'Toy Story 2' },
{ title: 'Toy Story 3' },
{ title: 'Toy Story of Terror' },
{ title: 'Toy Story That Time Forgot' }
]

次の例では、正規式配列を使用して、指定されたパターンのいずれかに一致する映画タイトルを検索します。クエリでは、Seattle で終わる、または Toy Story を含むタイトルが検索されます。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": ["(.*) Seattle", ".*Toy Story.*"]
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])
[
{ title: 'Sleepless in Seattle' },
{ title: 'Toy Story' },
{ title: 'Toy Story 2' },
{ title: 'Toy Story 3' },
{ title: 'Battle in Seattle' },
{ title: 'Toy Story of Terror' },
{ title: 'Toy Story That Time Forgot' }
]

次の例は、大文字と小文字を区別する一致を示しています。インデックスは、各インデックス値の元の大文字と小文字を保持する lucene.keywordアナライザを使用しているため、クエリは保存されたタイトルの大文字と小文字を正確に一致させる必要があります。クエリ .*Sleepless.*Sleepless in Seattle と一致しますが、.*sleepless.* は結果を返しません。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": ".*sleepless.*"
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])
<no results>

戻る

範囲

項目一覧