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

정규 표현식은 패턴 매칭에 사용되는데, 기본적으로 문서 내에서 문자열을 찾는 데 사용됩니다.
때로는 컬렉션의 문서를 검색할 때 검색할 정확한 필드 값이 무엇인지 정확히 알지 못할 수도 있습니다. 따라서 정규식을 사용하여 패턴 일치 검색 값을 기반으로 데이터를 검색하는 데 도움을 줄 수 있습니다.
패턴 매칭을 위해 $regex 연산자 사용
$regex 연산자는 MongoDB 컬렉션에서 특정 문자열을 검색하는 데 사용됩니다. 다음 예는 이것이 어떻게 수행될 수 있는지 보여줍니다.
우리가 "Employeeid"와 "EmployeeName"이라는 필드 이름을 가진 동일한 Employee 컬렉션을 가지고 있다고 가정해 보겠습니다. 또한 해당 컬렉션에 다음과 같은 문서가 있다고 가정해 보겠습니다.
| 직원 ID | 직원 이름 |
|---|---|
| 22 | 뉴마틴 |
| 2 | Mohan |
| 3 | 조 |
| 4 | 모한R |
| 100 | Guru99 |
| 6 | 구랑 |
아래 코드에서는 $regex 연산자를 사용하여 검색 조건을 지정했습니다.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code 설명 :
- 여기서는 'Gu'라는 문자가 포함된 모든 직원 이름을 찾으려고 합니다. 따라서 'Gu'를 검색 기준으로 정의하기 위해 $regex 연산자를 지정합니다.
- printjson은 쿼리에 의해 반환된 각 문서를 더 나은 방식으로 인쇄하는 데 사용됩니다.
명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.
출력:
출력에는 직원 이름에 'Gu' 문자가 포함된 문서가 반환되었음을 명확하게 보여줍니다.
만약 여러분의 컬렉션에 다음과 같은 문서들이 있고, 추가로 직원 이름이 "로 표시된 문서가 하나 더 있다고 가정해 봅시다.Guru검색 조건을 "999"로 입력했다면Guru"99"라고 표시되어 있으면 "가 포함된 문서도 반환됩니다.Guru999”. 하지만 만약 우리가 이것을 원하지 않고 단순히 “ ”만 포함된 문서를 반환하고 싶다면 어떻게 될까요?Guru99". 그런 다음 정확한 패턴 일치를 사용하여 이 작업을 수행할 수 있습니다. 정확한 패턴 일치를 위해 ^와 $ 문자를 사용합니다. 문자열의 시작 부분에 ^ 문자를 추가하고 문자열의 끝에 $ 문자를 추가합니다.
| 직원 ID | 직원 이름 |
|---|---|
| 22 | 뉴마틴 |
| 2 | Mohan |
| 3 | 조 |
| 4 | 모한R |
| 100 | Guru99 |
| 6 | 구랑 |
| 8 | Guru999 |
다음 예는 이것이 어떻게 이루어지는지 보여줍니다.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code 설명 :
- 여기 검색 조건에서 ^와 $ 문자를 사용하고 있습니다. ^는 문자열이 특정 문자로 시작하도록 하고, $는 문자열이 특정 문자로 끝나도록 합니다. 따라서 코드가 실행되면 이름이 " "인 문자열만 가져옵니다.Guru99. "
- printjson은 쿼리에 의해 반환된 각 문서를 더 나은 방식으로 인쇄하는 데 사용됩니다.
명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.
출력:
출력에서 문자열 "이 명확하게 보입니다.Guru99"가 검색되었습니다.
$options를 사용한 패턴 일치
$regex 연산자를 사용할 때 추가 옵션을 제공할 수도 있습니다. $ 옵션 예어. 예를 들어, 대소문자 구분 여부에 관계없이 직원 이름에 'Gu'가 포함된 모든 문서를 찾고 싶다고 가정해 보겠습니다. 그러한 결과를 원할 경우 다음을 사용해야 합니다. $ 옵션 대소문자 구분 안 함 매개변수를 사용합니다.
다음 예는 이것이 어떻게 이루어지는지 보여줍니다.
우리가 "Employeeid"와 "EmployeeName"이라는 필드 이름을 가진 동일한 Employee 컬렉션을 가지고 있다고 가정해 보겠습니다.
또한 우리가 다음과 같은 문서들을 소장하고 있다고 가정해 봅시다.
| 직원 ID | 직원 이름 |
|---|---|
| 22 | 뉴마틴 |
| 2 | Mohan |
| 3 | 조 |
| 4 | 모한R |
| 100 | Guru99 |
| 6 | 구랑 |
| 7 | 구루99 |
이제 이전 주제에서와 동일한 쿼리를 실행하면 결과에 "GURU99"가 포함된 문서는 나타나지 않습니다. 결과에 이 문서가 포함되도록 하려면 $options "i" 매개변수를 추가해야 합니다.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code 설명 :
- 'i' 매개변수(대소문자 구분 안 함)가 있는 $options는 'Gu'라는 글자가 소문자이든 대문자이든 상관없이 검색을 수행하도록 지정합니다.
명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.
출력:
- 출력 결과는 문서의 'Gu'가 대문자로 되어 있더라도 해당 문서가 결과 집합에 표시되는 것을 명확히 보여줍니다.
정규식 연산자 없이 패턴 매칭
`$regex` 연산자 없이도 패턴 매칭을 수행할 수 있습니다. 다음 예제는 그 방법을 보여줍니다.
db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
Code 설명 :
- "//" 구분 기호는 기본적으로 이 구분 기호 안에 검색 조건을 지정하는 것을 의미합니다. 따라서 "/Gu/"를 지정하면 직원 이름에 'Gu'가 포함된 문서를 다시 찾게 됩니다.
명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.
출력:
출력에는 직원 이름에 'Gu' 문자가 포함된 문서가 반환되었음을 명확하게 보여줍니다.
컬렉션에서 마지막 'n'개 문서 가져오기
컬렉션의 마지막 n개 문서를 가져오는 방법에는 여러 가지가 있습니다.
다음 단계를 통해 그 방법 중 하나를 살펴보겠습니다.
다음 예는 이것이 어떻게 이루어지는지 보여줍니다.
우리가 "Employeeid"와 "EmployeeName"이라는 필드 이름을 가진 동일한 Employee 컬렉션을 가지고 있다고 가정해 보겠습니다.
또한 우리가 소장하고 있는 문서가 다음과 같다고 가정해 봅시다.
| 직원 ID | 직원 이름 |
|---|---|
| 22 | 뉴마틴 |
| 2 | Mohan |
| 3 | 조 |
| 4 | 모한R |
| 100 | Guru99 |
| 6 | 구랑 |
| 7 | 구루99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code 설명 :
- 문서를 조회할 때, 컬렉션의 _id 필드 값을 기준으로 레코드를 역순으로 정렬하려면 정렬 함수를 사용하십시오. -1은 기본적으로 문서를 역순 또는 내림차순으로 정렬하여 마지막 문서가 맨 처음 표시되도록 함을 의미합니다.
- 그런 다음 limit 절을 사용하여 원하는 레코드 수만 표시합니다. 여기서는 limit 절(2)을 설정했으므로 마지막 두 문서를 가져옵니다.
명령이 성공적으로 실행되면 다음과 같은 출력이 표시됩니다.
출력:
출력은 컬렉션의 마지막 두 문서가 표시됨을 명확히 보여줍니다. 따라서 컬렉션의 마지막 'n'개 문서를 가져오려면 먼저 문서를 내림차순으로 정렬한 다음 limit 절을 사용하여 필요한 'n'개 문서 수를 반환할 수 있음을 명확히 보여주었습니다.
주의 사항: 38,000자를 초과하는 문자열에 대해 검색을 수행하면 올바른 결과가 표시되지 않습니다.










