문서 메뉴

문서 홈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
객체

일치하는 검색어 결과에 할당할 점수입니다. 옵션은 다음과 같습니다.

  • boost결과 점수에 주어진 숫자를 곱합니다.

  • constant결과 점수를 주어진 숫자로 바꿉니다.

  • function결과 점수를 주어진 표현식으로 대체합니다.

아니

regex 는 용어 수준 연산자이므로 query 필드는 분석되지 않습니다. 정규 표현식 검색은 한 번에 한 단어씩 필드를 인덱싱하기 때문에 키워드 분석기에서 잘 작동합니다. standard 분석기는 모든 용어의 대소문자를 구분하므로 대소문자 구분 검색을 수행하려면 기본 분석기인 표준 분석기는 사용하지 않습니다. 대신 다른 분석기를 지정해야 합니다.

allowAnalyzedField 옵션을 true로 설정하면 regex 연산자를 사용하여 분석된 필드에서 검색을 수행할 수 있지만 예상치 못한 결과가 나타날 수 있습니다.

예제

keyword 분석기로 색인된 필드에서 *Star Trek*을 검색하면 어떤 컨텍스트에서든 필드에 문자열 Star Trek 이 포함된 모든 문서를 찾을 수 있습니다. 표준 분석기로 인덱싱된 필드에서 *Star Trek*을 검색하면 StarTrek 사이에 공백이 있고 인덱스에 공백이 포함되어 있지 않기 때문에 아무것도 찾을 수 없습니다.

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 필드를 검색합니다. (.*) 정규 표현식은 임의 개수의 문자와 일치합니다.

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을(를) 사용하여 두 자리 숫자로 시작하고 공백이 뒤따르고, 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" : "17 Girls" }
{ "title" : "16 Acres" }
{ "title" : "26 Years" }
{ "title" : "99 Homes" }
{ "title" : "45 Years" }
← 범위
span →