문서 홈 → MongoDB 실행 및 관리 → MongoDB Atlas
정규식
정의
regex
regex
query
필드를 정규 표현식으로 해석합니다.regex
은 텀 수준 연산자이므로 필드는query
분석되지 않습니다.팁
다음도 참조하세요.
참고
regex
연산자가 사용할 수 있는 정규 표현식 언어는 PCRE 라이브러리의 제한된 하위 세트입니다.자세한 내용은 클래스 RegExp 를 참조하세요. 문서화.
구문
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
는 다음 용어를 사용하여 쿼리를 구성합니다:
필드 | 유형 | 설명 | 필요성 | 기본값 |
---|---|---|---|---|
query | 문자열 또는 문자열 배열 | 검색할 문자열 또는 문자열을 입력합니다. | 네 | |
path | 문자열 또는 문자열 배열 | 네 | ||
allowAnalyzedField | 부울 | 분석 필드에 대해 쿼리를 실행하는 경우 true 으로 설정해야 합니다. | 아니 | false |
score | 객체 | 일치하는 검색어 결과에 할당할 점수입니다. 옵션은 다음과 같습니다.
| 아니 |
행동
regex
는 용어 수준 연산자이므로 query
필드는 분석되지 않습니다. 정규 표현식 검색은 한 번에 한 단어씩 필드를 인덱싱하기 때문에 키워드 분석기에서 잘 작동합니다. standard
분석기는 모든 용어의 대소문자를 구분하므로 대소문자 구분 검색을 수행하려면 기본 분석기인 표준 분석기는 사용하지 않습니다. 대신 다른 분석기를 지정해야 합니다.
allowAnalyzedField
옵션을 true
로 설정하면 regex
연산자를 사용하여 분석된 필드에서 검색을 수행할 수 있지만 예상치 못한 결과가 나타날 수 있습니다.
예제
keyword
분석기로 색인된 필드에서 *Star Trek*
을 검색하면 어떤 컨텍스트에서든 필드에 문자열 Star Trek
이 포함된 모든 문서를 찾을 수 있습니다. 표준 분석기로 인덱싱된 필드에서 *Star
Trek*
을 검색하면 Star
와 Trek
사이에 공백이 있고 인덱스에 공백이 포함되어 있지 않기 때문에 아무것도 찾을 수 없습니다.
루센 정규 표현식 동작
Atlas Search regex
연산자는 Lucene 정규 표현식 엔진을 사용합니다. 이는 펄( Perl) 호환 정규 표현식과 다릅니다.
예약어
다음 문자는 정규 표현식에 사용될 때 연산자로 예약되어 있습니다.
. ? + * | { } [ ] ( ) < > " \ @ #
일치하는 표현식에서 위 문자를 그대로 사용하려면 앞에 \
문자를 추가합니다.
예제
who\?
는 'who?'와 일치합니다
mongosh
또는 드라이버 와 함께 이스케이프 문자를 사용하는 경우 이스케이프할 문자 앞에 이중 백슬래시를 사용해야 합니다.
예제
애그리게이션 파이프라인에서 리터럴 별표가 포함된 문자열을 검색하는 와일드카드 표현식을 만들려면 다음 표현식을 사용하세요.
"*\\**"
첫 번째 별표와 마지막 별표는 모든 문자와 일치하는 와일드카드 역할을 하며 \\*
는 리터럴 별표와 일치합니다.
참고
리터럴 백슬래시를 이스케이프하려면 다음 표현식을 사용합니다.
"*\\\*"
지원되는 연산자
연산자 | 설명 | 예제 |
---|---|---|
. | 모든 문자와 일치합니다. | x.z 는 'xyz', 'xaz' 등과 일치합니다. |
? | 앞 문자는 선택 사항이며 두 번 이상 나오지 않으면 일치합니다. | xyz? 'xy' 및 'xyz'와 일치 |
+ | 앞의 문자는 한 번 이상 발생하는 경우 일치합니다. | xy+ 'xy', 'xyy', 'xyyy' 등과 일치 |
* | 앞의 문자는 여러 번 발생하는 경우 일치합니다. | xyz* 일치하는 항목: "xy", "xyz", "xyzz" 등 |
| | OR 연산자입니다. | 연산자의 양쪽에 있는 두 패턴 중 더 긴 패턴이 일치하면 표현식이 일치합니다. | abc|xyz "abc" 또는 "xyz"와 일치 |
{<number>} | 앞의 문자가 정확히 <number> 번 발생하면 일치합니다. | xyz{3} 'xyzzz'와 일치 |
() | 괄호 안의 문자는 일치를 위해 단일 단위로 처리됩니다. | xyz(abc)[2] 'xyzabcabc'와 일치 |
[] | 대괄호 안의 모든 문자와 일치합니다. 시작 부분에 대괄호 안의 | [xyz] 'x', 'y' 및 'z'와 일치합니다.[^abc] 'a', 'b' 또는 'c'를 제외한 모든 문자와 일치[a-d] 'a', 'b', 'c' 또는 'd'와 일치합니다.[0-9] 0에서 9까지의 모든 숫자 문자와 일치 |
<> | 숫자 범위를 일치시킵니다. | <1-3> '1', '2', '3'과 일치합니다. |
# | 빈 언어 연산자입니다. # 연산자는 빈 문자열을 포함한 어떤 문자열과도 일치하지 않습니다. | #|xyz 'xyz'하고만 일치 |
지원되지 않는 연산자
regex
앵커 연산자 ^
및 $
을 지원하지 않습니다.
예제
다음 예제에서는 키워드 분석기를 사용하는 사용자 지정 인덱스 정의와 함께 sample_mflix
데이터베이스의 movies
컬렉션을 사용합니다. 클러스터에 샘플 데이터 세트가 있는 경우 movies
컬렉션에 Atlas Search 인덱스를 생성하고 클러스터에서 예제 쿼리를 실행할 수 있습니다.
팁
샘플 데이터 집합을 이미 로드한 경우, Atlas Search 시작하기 자습서에 따라 인덱스 정의를 만들고 Atlas Search 쿼리를 실행하세요.
인덱스 정의
다음 인덱스 정의는 키워드 분석기를사용하여 movies
컬렉션의 title
필드를 인덱싱합니다.
1 { 2 "mappings": { 3 "fields": { 4 "title": { 5 "analyzer": "lucene.keyword", 6 "type": "string" 7 } 8 } 9 } 10 }
다음 예시에서는 Seattle
단어로 끝나는 영화 제목에 대한 모든 title
필드를 검색합니다. (.*)
정규 표현식은 임의 개수의 문자와 일치합니다.
1 db.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
을(를) 사용하여 두 자리 숫자로 시작하고 공백이 뒤따르고, s
로 끝나는 다섯 자로 끝나는 영화 제목을 찾습니다.
1 db.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" : "17 Girls" } { "title" : "16 Acres" } { "title" : "26 Years" } { "title" : "99 Homes" } { "title" : "45 Years" }