문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

정규식 일치(집계)

이 페이지의 내용

  • 정의
  • 구문
  • 행동
  • 예제
$regexMatch

버전 4.2에 추가되었습니다.

표현식(regex) 패턴 일치를 수행하고 다음을 반환합니다.

  • true 일치하는 항목이 존재하는 경우

  • false 일치하는 항목이 존재하지 않는 경우

MongoDB는 펄(Perl) 호환 정규 표현식을 사용합니다(예: "PCRE" ) 버전 8.41(UTF-8 지원).

MongoDB 4.2 이전 버전에서는 aggregation pipeline이 $match 단계에서 $regex쿼리 연산자만 사용할 수 있습니다. 쿼리에서 정규식을 사용하는 방법에 대한 자세한 내용은 $regex를 참조하세요.

$regexMatch 연산자의 구문은 다음과 같습니다.

{ $regexMatch: { input: <expression> , regex: <expression>, options: <expression> } }
필드
설명
입력

정규식 패턴 을 적용할 문자열입니다. 문자열 또는 문자열로 해석되는 모든 유효한 표현식 일 수 있습니다.

적용할 정규식 패턴입니다. 문자열 또는 정규식 패턴 /<pattern>/(으)로 해석되는 모든 유효한 표현식일 수 있습니다. 정규식 /<pattern>/ 사용 시, 정규식 옵션 im(s 또는 x 옵션은 제외)도 지정할 수 있습니다.

  • "pattern"

  • /<pattern>/

  • /<pattern>/<options>

또는 options 필드를 사용하여 정규식 옵션을 지정할 수도 있습니다. s 또는 x 옵션을 지정하려면 options 필드를 사용해야 합니다.

regexoptions 필드 모두에 옵션을 지정할 수 없습니다.

선택 사항입니다. 다음 <options>은 정규 표현식에 사용할 수 있습니다.

참고

regexoptions 필드 모두에 옵션을 지정할 수 없습니다.

옵션
설명
i
대소문자 구분 없이 대문자와 소문자를 모두 일치시키기 위한 옵션입니다. options 필드에 옵션을 지정하거나 정규식 필드의 일부로 지정할 수 있습니다.
m

앵커가 포함된 패턴의 경우(즉, 시작은 ^, 끝은 $), 여러 줄 값이 있는 문자열의 각 줄의 시작 또는 끝에서 일치시킵니다. 이 옵션이 없으면 이러한 앵커는 문자열의 시작 또는 끝에서 일치합니다.

패턴에 앵커가 포함되어 있지 않거나 문자열 값에 개행 문자가 없는 경우(예: \n), m 옵션은 효과가 없습니다.

x

이스케이프 처리되거나 문자 클래스에 포함되지 않는 한 패턴의 모든 공백 문자를 무시하는 "확장" 기능을 제공합니다.

또한 이스케이프되지 않은 해시/파운드 (#) 문자와 그 다음 개행까지의 문자를 무시하여 복잡한 패턴에 주석을 포함할 수 있습니다. 이 규칙은 데이터 문자에만 적용되며, 패턴의 특수 문자 시퀀스 내에는 공백 문자가 나타날 수 없습니다.

x 옵션은 VT 문자 처리에 영향을 주지 않습니다(예: 코드 11).

options 필드에서만 옵션을 지정할 수 있습니다.

s

점 문자(예 .) 개행 문자를 포함한 모든 문자와 일치합니다.

options 필드에서만 옵션을 지정할 수 있습니다.

연산자는 부울을 반환합니다.

  • true 일치하는 항목이 존재하는 경우

  • false 일치하는 항목이 존재하지 않는 경우

다음도 참조하세요.

$regexMatch 는 컬렉션 db.collection.aggregate() 및 인덱스(사용된 경우)에 지정된 데이터 정렬을 무시합니다.

예를 들어 데이터 정렬 강도가 1인 샘플 컬렉션을 생성합니다(예: 기본 문자만 비교하고 대소문자 및 발음 구별 부호와 같은 다른 차이점은 무시합니다).

db.createCollection( "myColl", { collation: { locale: "fr", strength: 1 } } )

다음 문서를 삽입합니다.

db.myColl.insertMany([
{ _id: 1, category: "café" },
{ _id: 2, category: "cafe" },
{ _id: 3, category: "cafE" }
])

collection의 데이터 정렬을 사용하여 다음 작업은 대/소문자를 구분하지 않고 발음 구별 기호를 구분하지 않는 일치를 수행합니다.

db.myColl.aggregate( [ { $match: { category: "cafe" } } ] )

이 작업은 다음 3개의 문서를 반환합니다.

{ "_id" : 1, "category" : "café" }
{ "_id" : 2, "category" : "cafe" }
{ "_id" : 3, "category" : "cafE" }

그러나 애그리게이션 표현식 $regexMatch 는 데이터 정렬을 무시합니다. 즉, 다음 정규 표현식 패턴 일치 예제는 대소문자를 구분하고 발음 부호를 구분합니다.

db.myColl.aggregate( [ { $addFields: { results: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ] )
db.myColl.aggregate(
[ { $addFields: { results: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ],
{ collation: { locale: "fr", strength: 1 } } // Ignored in the $regexMatch
)

두 연산 모두 다음과 같은 결과를 반환합니다.

{ "_id" : 1, "category" : "café", "results" : false }
{ "_id" : 2, "category" : "cafe", "results" : true }
{ "_id" : 3, "category" : "cafE", "results" : false }

대소문자를 구분하지 않는 정규식 패턴 일치를 수행하려면 i 옵션 을 대신 사용합니다. 예시는 i 옵션 을 참조하세요.

이 예제에서 설명한 $regexMatch 연산자의 동작을 설명하기 위해 다음 문서를 사용하여 샘플 컬렉션 products 를 만듭니다.

db.products.insertMany([
{ _id: 1, description: "Single LINE description." },
{ _id: 2, description: "First lines\nsecond line" },
{ _id: 3, description: "Many spaces before line" },
{ _id: 4, description: "Multiple\nline descriptions" },
{ _id: 5, description: "anchors, links and hyperlinks" },
{ _id: 6, description: "métier work vocation" }
])

기본적으로 $regexMatch 는 대소문자를 구분하는 일치를 수행합니다. 예를 들어, 다음 애그리게이션은 description 필드에서 대소문자를구분 하는 $regexMatch 를 수행합니다. 정규식 패턴 /line/ 은(는) 그룹화를 지정하지 않습니다.

db.products.aggregate([
{ $addFields: { result: { $regexMatch: { input: "$description", regex: /line/ } } } }
])

이 연산은 다음을 반환합니다:

{ "_id" : 1, "description" : "Single LINE description.", "result" : false }
{ "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
{ "_id" : 3, "description" : "Many spaces before line", "result" : true }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false }
{ "_id" : 6, "description" : "métier work vocation", "result" : false }

다음 정규식 패턴 /lin(e|k)/ 은 패턴에서 그룹화 (e|k) 을 지정합니다.

db.products.aggregate([
{ $addFields: { result: { $regexMatch: { input: "$description", regex: /lin(e|k)/ } } } }
])

이 연산은 다음을 반환합니다:

{ "_id" : 1, "description" : "Single LINE description.", "result" : false }
{ "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
{ "_id" : 3, "description" : "Many spaces before line", "result" : true }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : true }
{ "_id" : 6, "description" : "métier work vocation", "result" : false }

참고

regexoptions 필드 모두에 옵션을 지정할 수 없습니다.

대소문자를구분하지 않는 패턴 일치를 수행하려면 i 옵션을 regex 필드의 일부로 포함하거나 options 필드에 포함합니다.

// Specify i as part of the regex field
{ $regexMatch: { input: "$description", regex: /line/i } }
// Specify i in the options field
{ $regexMatch: { input: "$description", regex: /line/, options: "i" } }
{ $regexMatch: { input: "$description", regex: "line", options: "i" } }

예를 들어, 다음 애그리게이션은 description 필드에서 대소문자를구분하지 않는 $regexMatch 를 수행합니다. 정규식 패턴 /line/ 은(는) 그룹화를 지정하지 않습니다.

db.products.aggregate([
{ $addFields: { result: { $regexMatch: { input: "$description", regex: /line/i } } } }
])

이 작업은 다음 문서를 반환합니다.

{ "_id" : 1, "description" : "Single LINE description.", "result" : true }
{ "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
{ "_id" : 3, "description" : "Many spaces before line", "result" : true }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false }
{ "_id" : 6, "description" : "métier work vocation", "result" : false }

참고

regexoptions 필드 모두에 옵션을 지정할 수 없습니다.

여러 줄 문자열의 각 줄에 대해 지정된 앵커(예: ^, $)를 일치시키려면 m 옵션을 regex 필드의 일부로 포함하거나 options 필드에 포함합니다.

// Specify m as part of the regex field
{ $regexMatch: { input: "$description", regex: /line/m } }
// Specify m in the options field
{ $regexMatch: { input: "$description", regex: /line/, options: "m" } }
{ $regexMatch: { input: "$description", regex: "line", options: "m" } }

다음 예제에는 여러 줄 문자열의 경우 문자 s 또는 S로 시작하는 줄을 일치시키는 im 옵션이 모두 포함되어 있습니다.

db.products.aggregate([
{ $addFields: { result: { $regexMatch: { input: "$description", regex: /^s/im } } } }
])

이 연산은 다음을 반환합니다:

{ "_id" : 1, "description" : "Single LINE description.", "result" : true }
{ "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
{ "_id" : 3, "description" : "Many spaces before line", "result" : false }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "result" : false }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false }
{ "_id" : 6, "description" : "métier work vocation", "result" : false }

참고

regexoptions 필드 모두에 옵션을 지정할 수 없습니다.

패턴에서 이스케이프되지 않은 모든 공백 문자와 주석(이스케이프되지 않은 해시 # 문자와 다음 줄 바꿈 문자로 표시됨)을 무시하려면 옵션 필드에 s 옵션을 포함합니다.

// Specify x in the options field
{ $regexMatch: { input: "$description", regex: /line/, options: "x" } }
{ $regexMatch: { input: "$description", regex: "line", options: "x" } }

다음 예제에는 이스케이프되지 않은 공백과 주석을 건너뛰는 x 옵션이 포함되어 있습니다.

db.products.aggregate([
{ $addFields: { returns: { $regexMatch: { input: "$description", regex: /lin(e|k) # matches line or link/, options:"x" } } } }
])

이 연산은 다음을 반환합니다:

{ "_id" : 1, "description" : "Single LINE description.", "returns" : false }
{ "_id" : 2, "description" : "First lines\nsecond line", "returns" : true }
{ "_id" : 3, "description" : "Many spaces before line", "returns" : true }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returns" : true }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returns" : true }
{ "_id" : 6, "description" : "métier work vocation", "returns" : false }

참고

regexoptions 필드 모두에 옵션을 지정할 수 없습니다.

패턴의 점 문자(예: )가 줄 바꿈. 문자를 포함한 모든 문자와 일치하도록 하려면 옵션 필드에 s 옵션을 포함합니다.

// Specify s in the options field
{ $regexMatch: { input: "$description", regex: /m.*line/, options: "s" } }
{ $regexMatch: { input: "$description", regex: "m.*line", options: "s" } }

다음 예에는 점 문자(예:.)가 새 줄을 포함한 모든 문자와 일치하도록 허용하는 s 옵션과 대소문자를 구분하지 않는 일치를 수행하는 i 옵션이 포함되어 있습니다.

db.products.aggregate([
{ $addFields: { returns: { $regexMatch: { input: "$description", regex:/m.*line/, options: "si" } } } }
])

이 연산은 다음을 반환합니다:

{ "_id" : 1, "description" : "Single LINE description.", "returns" : false }
{ "_id" : 2, "description" : "First lines\nsecond line", "returns" : false }
{ "_id" : 3, "description" : "Many spaces before line", "returns" : true }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returns" : true }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returns" : false }
{ "_id" : 6, "description" : "métier work vocation", "returns" : false }

다음 문서를 사용하여 샘플 collection feedback 을 만듭니다.

db.feedback.insertMany([
{ "_id" : 1, comment: "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com" },
{ "_id" : 2, comment: "I wanted to concatenate a string" },
{ "_id" : 3, comment: "How do I convert a date to string? Contact me at either cam@mongodb.com or c.dia@mongodb.com" },
{ "_id" : 4, comment: "It's just me. I'm testing. fred@MongoDB.com" }
])

다음 애그리게이션에서는 $regexMatch 를 사용하여 comment 필드에 @mongodb.com 가 포함된 이메일 주소가 포함되어 있는지 확인하고 피드백을 Employee 또는 External 로 분류합니다.

db.feedback.aggregate( [
{ $addFields: {
"category": { $cond: { if: { $regexMatch: { input: "$comment", regex: /[a-z0-9_.+-]+@mongodb.com/i } },
then: "Employee",
else: "External" } }
} },

이 작업은 다음 문서를 반환합니다.

{ "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "category" : "External" }
{ "_id" : 2, "comment" : "I wanted to concatenate a string", "category" : "External" }
{ "_id" : 3, "comment" : "How do I convert a date to string? Contact me at either cam@mongodb.com or c.dia@mongodb.com", "category" : "Employee" }
{ "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "category" : "Employee" }
← 정규식 찾기(집계)

이 페이지의 내용