MongoDB 정규 표현식($regex) 및 예제

⚡ 스마트 요약

MongoDB 정규 표현식은 `$regex` 연산자, 대소문자를 구분하지 않는 `$options` 플래그, 정확한 일치를 위한 앵커, 그리고 정확한 필드 값을 알 수 없을 때 슬래시 구분 기호를 사용하여 문서 내에서 문자열을 찾는 패턴 일치를 수행합니다.

  • 🔍 $정규식 Opera토르: db.collection.find({field:{$regex:”pattern”}})는 해당 패턴을 포함하는 문서를 찾습니다.
  • 🎯 Anchors: ^와 $는 정확한 일치를 강제하며, 패턴을 문자열의 시작과 끝에 연결합니다.
  • 🔠 대소문자 구분 안 함: `$options`의 'i' 플래그는 대소문자를 구분하지 않고 텍스트와 일치합니다.
  • 슬래시 구분 기호: 포장을ping /…/ 경로의 패턴은 $regex 연산자를 작성하지 않고도 일치합니다.
  • 📉 최근 N개 문서: sort({_id:-1})와 limit(n)을 결합하여 최신 레코드를 반환합니다.
  • 🤖 AI 지원: 어시스턴트는 정규 표현식 패턴을 구축하고 전체 컬렉션 스캔 성능 비용을 표시합니다.

MongoDB 정규 표현식(Regex)

정규 표현식은 패턴 매칭에 사용되는데, 기본적으로 문서 내에서 문자열을 찾는 데 사용됩니다.

때로는 컬렉션의 문서를 검색할 때 검색할 정확한 필드 값이 무엇인지 정확히 알지 못할 수도 있습니다. 따라서 정규식을 사용하여 패턴 일치 검색 값을 기반으로 데이터를 검색하는 데 도움을 줄 수 있습니다.

패턴 매칭을 위해 $regex 연산자 사용

$regex 연산자는 MongoDB 컬렉션에서 특정 문자열을 검색하는 데 사용됩니다. 다음 예는 이것이 어떻게 수행될 수 있는지 보여줍니다.

우리가 "Employeeid"와 "EmployeeName"이라는 필드 이름을 가진 동일한 Employee 컬렉션을 가지고 있다고 가정해 보겠습니다. 또한 해당 컬렉션에 다음과 같은 문서가 있다고 가정해 보겠습니다.

직원 ID 직원 이름
22 뉴마틴
2 Mohan
3
4 모한R
100 Guru99
6 구랑

아래 코드에서는 $regex 연산자를 사용하여 검색 조건을 지정했습니다.

$regex 사용 Opera패턴 매칭을 위한 토르

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code 설명 :

  1. 여기서는 'Gu'라는 문자가 포함된 모든 직원 이름을 찾으려고 합니다. 따라서 'Gu'를 검색 기준으로 정의하기 위해 $regex 연산자를 지정합니다.
  2. printjson은 쿼리에 의해 반환된 각 문서를 더 나은 방식으로 인쇄하는 데 사용됩니다.

명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.

출력:

$regex 사용 Opera패턴 매칭을 위한 토르

출력에는 직원 이름에 'Gu' 문자가 포함된 문서가 반환되었음을 명확하게 보여줍니다.

만약 여러분의 컬렉션에 다음과 같은 문서들이 있고, 추가로 직원 이름이 "로 표시된 문서가 하나 더 있다고 가정해 봅시다.Guru검색 조건을 "999"로 입력했다면Guru"99"라고 표시되어 있으면 "가 포함된 문서도 반환됩니다.Guru999”. 하지만 만약 우리가 이것을 원하지 않고 단순히 “ ”만 포함된 문서를 반환하고 싶다면 어떻게 될까요?Guru99". 그런 다음 정확한 패턴 일치를 사용하여 이 작업을 수행할 수 있습니다. 정확한 패턴 일치를 위해 ^와 $ 문자를 사용합니다. 문자열의 시작 부분에 ^ 문자를 추가하고 문자열의 끝에 $ 문자를 추가합니다.

직원 ID 직원 이름
22 뉴마틴
2 Mohan
3
4 모한R
100 Guru99
6 구랑
8 Guru999

다음 예는 이것이 어떻게 이루어지는지 보여줍니다.

$regex 사용 Opera패턴 매칭을 위한 토르

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code 설명 :

  1. 여기 검색 조건에서 ^와 $ 문자를 사용하고 있습니다. ^는 문자열이 특정 문자로 시작하도록 하고, $는 문자열이 특정 문자로 끝나도록 합니다. 따라서 코드가 실행되면 이름이 " "인 문자열만 가져옵니다.Guru99. "
  2. printjson은 쿼리에 의해 반환된 각 문서를 더 나은 방식으로 인쇄하는 데 사용됩니다.

명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.

출력:

$regex 사용 Opera패턴 매칭을 위한 토르

출력에서 문자열 "이 명확하게 보입니다.Guru99"가 검색되었습니다.

$options를 사용한 패턴 일치

$regex 연산자를 사용할 때 추가 옵션을 제공할 수도 있습니다. $ 옵션 예어. 예를 들어, 대소문자 구분 여부에 관계없이 직원 이름에 'Gu'가 포함된 모든 문서를 찾고 싶다고 가정해 보겠습니다. 그러한 결과를 원할 경우 다음을 사용해야 합니다. $ 옵션 대소문자 구분 안 함 매개변수를 사용합니다.

다음 예는 이것이 어떻게 이루어지는지 보여줍니다.

우리가 "Employeeid"와 "EmployeeName"이라는 필드 이름을 가진 동일한 Employee 컬렉션을 가지고 있다고 가정해 보겠습니다.

또한 우리가 다음과 같은 문서들을 소장하고 있다고 가정해 봅시다.

직원 ID 직원 이름
22 뉴마틴
2 Mohan
3
4 모한R
100 Guru99
6 구랑
7 구루99

이제 이전 주제에서와 동일한 쿼리를 실행하면 결과에 "GURU99"가 포함된 문서는 나타나지 않습니다. 결과에 이 문서가 포함되도록 하려면 $options "i" 매개변수를 추가해야 합니다.

$options를 사용한 패턴 일치

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code 설명 :

  1. 'i' 매개변수(대소문자 구분 안 함)가 있는 $options는 'Gu'라는 글자가 소문자이든 대문자이든 상관없이 검색을 수행하도록 지정합니다.

명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.

출력:

$options를 사용한 패턴 일치

  1. 출력 결과는 문서의 'Gu'가 대문자로 되어 있더라도 해당 문서가 결과 집합에 표시되는 것을 명확히 보여줍니다.

정규식 연산자 없이 패턴 매칭

`$regex` 연산자 없이도 패턴 매칭을 수행할 수 있습니다. 다음 예제는 그 방법을 보여줍니다.

정규식 없이 패턴 일치 Opera바위 산

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code 설명 :

  1. "//" 구분 기호는 기본적으로 이 구분 기호 안에 검색 조건을 지정하는 것을 의미합니다. 따라서 "/Gu/"를 지정하면 직원 이름에 'Gu'가 포함된 문서를 다시 찾게 됩니다.

명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.

출력:

정규식 없이 패턴 일치 Opera바위 산

출력에는 직원 이름에 'Gu' 문자가 포함된 문서가 반환되었음을 명확하게 보여줍니다.

컬렉션에서 마지막 'n'개 문서 가져오기

컬렉션의 마지막 n개 문서를 가져오는 방법에는 여러 가지가 있습니다.

다음 단계를 통해 그 방법 중 하나를 살펴보겠습니다.

다음 예는 이것이 어떻게 이루어지는지 보여줍니다.

우리가 "Employeeid"와 "EmployeeName"이라는 필드 이름을 가진 동일한 Employee 컬렉션을 가지고 있다고 가정해 보겠습니다.

또한 우리가 소장하고 있는 문서가 다음과 같다고 가정해 봅시다.

직원 ID 직원 이름
22 뉴마틴
2 Mohan
3
4 모한R
100 Guru99
6 구랑
7 구루99

컬렉션에서 최근 n개 문서 가져오기

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code 설명 :

  1. 문서를 조회할 때, 컬렉션의 _id 필드 값을 기준으로 레코드를 역순으로 정렬하려면 정렬 함수를 사용하십시오. -1은 기본적으로 문서를 역순 또는 내림차순으로 정렬하여 마지막 문서가 맨 처음 표시되도록 함을 의미합니다.
  2. 그런 다음 limit 절을 사용하여 원하는 레코드 수만 표시합니다. 여기서는 limit 절(2)을 설정했으므로 마지막 두 문서를 가져옵니다.

명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.

출력:

컬렉션에서 최근 n개 문서 가져오기

출력은 컬렉션의 마지막 두 문서가 표시됨을 명확히 보여줍니다. 따라서 컬렉션의 마지막 'n'개 문서를 가져오려면 먼저 문서를 내림차순으로 정렬한 다음 limit 절을 사용하여 필요한 'n'개 문서 수를 반환할 수 있음을 명확히 보여주었습니다.

주의 사항: 38,000자를 초과하는 문자열에 대해 검색을 수행하면 올바른 결과가 표시되지 않습니다.

자주 묻는 질문

Anchor ^와 $로 이루어진 패턴. 패턴 “^Guru99달러”는 다음만 일치합니다.Guru99”를 거부하고 “Guru^는 문자열의 시작을, $는 문자열의 끝을 나타내기 때문에 "999"입니다.

접두사 '^'가 붙은 대소문자 구분 패턴만 인덱스를 효율적으로 사용합니다. 접두사가 고정되지 않았거나 대소문자를 구분하지 않는 패턴은 전체 컬렉션 스캔을 유발하므로 가능한 한 접두사를 고정하십시오.

마침표, 별표, 더하기 기호, 대괄호와 같은 메타 문자 앞에는 백슬래시를 붙여야 합니다. 예를 들어, ".com"과 같은 리터럴 접미사를 사용하는 패턴은 마침표를 이스케이프 처리하여 어떤 문자로도 취급되지 않도록 합니다.

`$regex`는 하나의 필드에 대해 유연한 패턴 일치를 수행하며 전체 컬렉션을 스캔할 수 있습니다. `$text`는 텍스트 인덱스를 사용하여 인덱싱된 필드 전체에서 빠른 단어 기반 검색을 제공하지만 부분 문자열 패턴은 지원하지 않습니다.

예. 검색어 길이가 약 38,000자를 초과하면 정확한 결과가 나오지 않을 수 있습니다. 정확한 검색을 위해서는 패턴과 대상 필드를 해당 길이 내로 유지하십시오.

대소문자를 구분하지 않는 조회를 위해 필드 값을 소문자로 저장하고, ^를 사용하여 패턴을 고정하며, 대규모 컬렉션의 경우 고정되지 않은 $regex 대신 텍스트 인덱스 또는 Atlas 검색을 사용하는 것이 좋습니다.

AI 어시스턴트는 일반 영어 규칙을 정규 표현식 패턴으로 변환하고, 올바른 앵커와 옵션 플래그를 추가하며, 쿼리가 전체 컬렉션 스캔을 유발하여 속도가 느려질 경우 경고합니다.

예. AI 코파일럿은 고정되지 않은 패턴을 재작성하고, 텍스트 인덱스 또는 Atlas 검색을 추천하며, 대소문자를 구분하지 않는 정규 표현식을 속도 향상을 위해 소문자로 변환한 필드 조회로 변환합니다.

이 게시물을 요약하면 다음과 같습니다.