Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

regexFind(집계)

이 페이지의 내용

  • 정의
  • 구문
  • 행동
  • 예시
$regexFind

집계 표현식에서 정규 표현식(regex) 패턴 일치 기능을 제공합니다. 일치 항목을 찾으면 첫 번째 일치 항목에 대한 정보가 포함된 문서를 반환합니다. 일치 항목을 찾지 못하면 null을 반환합니다.

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

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

{ $regexFind: { 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 필드에서만 옵션을 지정할 수 있습니다.

연산자가 일치하는 항목을 찾지 못하면 연산자의 결과는 null이 됩니다.

연산자가 일치 항목을 찾으면 연산자의 결과는 다음을 포함하는 문서입니다.

{ "match" : <string>, "idx" : <num>, "captures" : <array of strings> }

다음도 참조하세요.

$regexFind는 컬렉션에 지정된 데이터 정렬인 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" }

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

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

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

{ "_id" : 1, "category" : "café", "resultObject" : null }
{ "_id" : 2, "category" : "cafe", "resultObject" : { "match" : "cafe", "idx" : 0, "captures" : [ ] } }
{ "_id" : 3, "category" : "cafE", "resultObject" : null }

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

정규식 패턴 에 캡처 그룹이 포함되어 있고 패턴 이 입력 에서 일치하는 항목을 찾는 경우 결과의 captures 배열 은 일치하는 string 에 의해 캡처된 그룹에 해당합니다. 캡처 그룹은 정규식 패턴 에서 이스케이프되지 않은 괄호 () 로 지정됩니다. captures 배열 의 길이는 패턴 의 캡처 그룹 수와 같고 배열 의 순서는 캡처 그룹이 나타나는 순서와 일치합니다.

다음 문서를 사용하여 contacts라는 이름의 샘플 collection을 생성합니다.

db.contacts.insertMany([
{ "_id": 1, "fname": "Carol", "lname": "Smith", "phone": "718-555-0113" },
{ "_id": 2, "fname": "Daryl", "lname": "Doe", "phone": "212-555-8832" },
{ "_id": 3, "fname": "Polly", "lname": "Andrews", "phone": "208-555-1932" },
{ "_id": 4, "fname": "Colleen", "lname": "Duncan", "phone": "775-555-0187" },
{ "_id": 5, "fname": "Luna", "lname": "Clarke", "phone": "917-555-4414" }
])

다음 파이프라인은 fname 필드에 정규식 패턴 /(C(ar)*)ol/을 다음과 같이 적용합니다.

db.contacts.aggregate([
{
$project: {
returnObject: {
$regexFind: { input: "$fname", regex: /(C(ar)*)ol/ }
}
}
}
])

정규식 패턴은 fnameCarolColleen과 일치하는 항목을 찾습니다.

{ "_id" : 1, "returnObject" : { "match" : "Carol", "idx" : 0, "captures" : [ "Car", "ar" ] } }
{ "_id" : 2, "returnObject" : null }
{ "_id" : 3, "returnObject" : null }
{ "_id" : 4, "returnObject" : { "match" : "Col", "idx" : 0, "captures" : [ "C", null ] } }
{ "_id" : 5, "returnObject" : null }

패턴에 중첩된 그룹 (ar)이 포함된 캡처 그룹 (C(ar)*) 이 포함되어 있습니다. captures 배열의 요소는 두 개의 캡처 그룹에 해당합니다. 일치하는 문서가 그룹에 의해 캡처되지 않은 경우(예: Colleen 및 그룹 (ar)), $regexFind는 그룹을 null 자리 표시자로 바꿉니다.

이전 예시에 표시된 것처럼 captures 배열에는 각 캡처 그룹에 대한 요소가 포함되어 있습니다(비캡처에는 null 사용). 다음 예제에서 phone 필드에 논리적 or의 캡처 그룹을 적용하여 뉴욕시 지역 번호가 있는 전화번호를 검색하는 경우를 살펴보세요. 각 그룹은 뉴욕시 지역 번호를 나타냅니다.

db.contacts.aggregate([
{
$project: {
nycContacts: {
$regexFind: { input: "$phone", regex: /^(718).*|^(212).*|^(917).*/ }
}
}
}
])

정규식 패턴 과 일치하는 문서의 경우 captures 배열 은 일치하는 캡처 그룹 을 포함하고 캡처하지 않는 그룹을 null 로 바꿉니다.

{ "_id" : 1, "nycContacts" : { "match" : "718-555-0113", "idx" : 0, "captures" : [ "718", null, null ] } }
{ "_id" : 2, "nycContacts" : { "match" : "212-555-8832", "idx" : 0, "captures" : [ null, "212", null ] } }
{ "_id" : 3, "nycContacts" : null }
{ "_id" : 4, "nycContacts" : null }
{ "_id" : 5, "nycContacts" : { "match" : "917-555-4414", "idx" : 0, "captures" : [ null, null, "917" ] } }

이 예시에서 말한 $regexFind 연산자의 동작을 설명하기 위해 다음 문서를 사용하여 샘플 컬렉션 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" }
])

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

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

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

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ ] } }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ ] } }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ ] } }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null }
{ "_id" : 6, "description" : "métier work vocation", "returnObject" : null }

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

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

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

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ "e" ] } }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ "e" ] } }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ "e" ] } }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : { "match" : "link", "idx" : 9, "captures" : [ "k" ] } }
{ "_id" : 6, "description" : "métier work vocation", "returnObject" : null }

반환 옵션에서 idx 필드는 바이트 인덱스가 아닌 코드 포인트 인덱스입니다. 예를 들어, 정규식 패턴 /tier/를 사용하는 다음 예시를 살펴보겠습니다.

db.products.aggregate([
{ $addFields: { returnObject: { $regexFind: { input: "$description", regex: /tier/ } } } }
])

이 연산은 마지막 레코드만 패턴과 일치하고 반환된 idx2(바이트 인덱스를 사용하는 경우 3 대신)인 경우 다음을 반환합니다.

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : null }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : null }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : null }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null }
{ "_id" : 6, "description" : "métier work vocation",
"returnObject" : { "match" : "tier", "idx" : 2, "captures" : [ ] } }

참고

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

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

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

예를 들어, 다음 집계는 description 필드에서 대소문자를 구분하지 않는 $regexFind를 수행합니다. 정규식 패턴 /line/은 다음과 같이 그룹화를 지정하지 않습니다.

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

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

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : { "match" : "LINE", "idx" : 7, "captures" : [ ] } }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ ] } }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ ] } }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ ] } }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null }
{ "_id" : 6, "description" : "métier work vocation", "returnObject" : null }

참고

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

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

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

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

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

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

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : { "match" : "S", "idx" : 0, "captures" : [ ] } }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "s", "idx" : 12, "captures" : [ ] } }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : null }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : null }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null }
{ "_id" : 6, "description" : "métier work vocation", "returnObject" : null }

참고

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

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

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

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

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

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

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : { "match" : "line", "idx" : 6, "captures" : [ "e" ] } }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "line", "idx" : 23, "captures" : [ "e" ] } }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "line", "idx" : 9, "captures" : [ "e" ] } }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : { "match" : "link", "idx" : 9, "captures" : [ "k" ] } }
{ "_id" : 6, "description" : "métier work vocation", "returnObject" : null }

참고

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

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

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

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

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

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

{ "_id" : 1, "description" : "Single LINE description.", "returnObject" : null }
{ "_id" : 2, "description" : "First lines\nsecond line", "returnObject" : null }
{ "_id" : 3, "description" : "Many spaces before line", "returnObject" : { "match" : "Many spaces before line", "idx" : 0, "captures" : [ ] } }
{ "_id" : 4, "description" : "Multiple\nline descriptions", "returnObject" : { "match" : "Multiple\nline", "idx" : 0, "captures" : [ ] } }
{ "_id" : 5, "description" : "anchors, links and hyperlinks", "returnObject" : null }
{ "_id" : 6, "description" : "métier work vocation", "returnObject" : null }

다음 문서를 사용하여 샘플 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? cam@mongodb.com" },
{ "_id" : 4, comment: "It's just me. I'm testing. fred@MongoDB.com" }
])

다음 집계는 $regexFind를 사용하여 comment 필드에서 이메일을 추출합니다(대소문자 구분 없음).

db.feedback.aggregate( [
{ $addFields: {
"email": { $regexFind: { input: "$comment", regex: /[a-z0-9_.+-]+@[a-z0-9_.+-]+\.[a-z0-9_.+-]+/i } }
} },
{ $set: { email: "$email.match"} }
] )
첫 번째 단계

이 단계에서는 $addFields 단계를 사용하여 문서에 새 필드 email 을 추가합니다. 새 필드는 comment 필드에 $regexFind를 수행한 결과를 포함합니다.

{ "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "email" : { "match" : "aunt.arc.tica@example.com", "idx" : 38, "captures" : [ ] } }
{ "_id" : 2, "comment" : "I wanted to concatenate a string", "email" : null }
{ "_id" : 3, "comment" : "I can't find how to convert a date to string. cam@mongodb.com", "email" : { "match" : "cam@mongodb.com", "idx" : 46, "captures" : [ ] } }
{ "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "email" : { "match" : "fred@MongoDB.com", "idx" : 28, "captures" : [ ] } }
두 번째 단계

이 단계는 $set 단계를 사용하여 email 값을 현재 "$email.match" 값으로 재설정합니다. email의 현재 값이 null이면 email의 새로운 값도 null로 설정됩니다.

{ "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "email" : "aunt.arc.tica@example.com" }
{ "_id" : 2, "comment" : "I wanted to concatenate a string" }
{ "_id" : 3, "comment" : "I can't find how to convert a date to string. cam@mongodb.com", "email" : "cam@mongodb.com" }
{ "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "email" : "fred@MongoDB.com" }

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

db.contacts.insertMany([
{ "_id" : 1, name: "Aunt Arc Tikka", details: [ "+672-19-9999", "aunt.arc.tica@example.com" ] },
{ "_id" : 2, name: "Belle Gium", details: [ "+32-2-111-11-11", "belle.gium@example.com" ] },
{ "_id" : 3, name: "Cam Bo Dia", details: [ "+855-012-000-0000", "cam.bo.dia@example.com" ] },
{ "_id" : 4, name: "Fred", details: [ "+1-111-222-3333" ] }
])

다음 집계 은 $regexFind 를 사용하여 details 배열 을 emailphone 필드가 있는 내장된 문서 로 변환합니다.

db.contacts.aggregate( [
{ $unwind: "$details" },
{ $addFields: {
"regexemail": { $regexFind: { input: "$details", regex: /^[a-z0-9_.+-]+@[a-z0-9_.+-]+\.[a-z0-9_.+-]+$/, options: "i" } },
"regexphone": { $regexFind: { input: "$details", regex: /^[+]{0,1}[0-9]*\-?[0-9_\-]+$/ } }
} },
{ $project: { _id: 1, name: 1, details: { email: "$regexemail.match", phone: "$regexphone.match" } } },
{ $group: { _id: "$_id", name: { $first: "$name" }, details: { $mergeObjects: "$details"} } },
{ $sort: { _id: 1 } }
])
첫 번째 단계

$unwinds 단계에서 배열을 개별 문서로:

{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "+672-19-9999" }
{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "aunt.arc.tica@example.com" }
{ "_id" : 2, "name" : "Belle Gium", "details" : "+32-2-111-11-11" }
{ "_id" : 2, "name" : "Belle Gium", "details" : "belle.gium@example.com" }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : "+855-012-000-0000" }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : "cam.bo.dia@example.com" }
{ "_id" : 4, "name" : "Fred", "details" : "+1-111-222-3333" }
두 번째 단계

이 단계에서는 $addFields 단계를 사용하여 전화번호 및 이메일에 대한 $regexFind 결과가 포함된 문서에 새 필드를 추가합니다.

{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "+672-19-9999", "regexemail" : null, "regexphone" : { "match" : "+672-19-9999", "idx" : 0, "captures" : [ ] } }
{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : "aunt.arc.tica@example.com", "regexemail" : { "match" : "aunt.arc.tica@example.com", "idx" : 0, "captures" : [ ] }, "regexphone" : null }
{ "_id" : 2, "name" : "Belle Gium", "details" : "+32-2-111-11-11", "regexemail" : null, "regexphone" : { "match" : "+32-2-111-11-11", "idx" : 0, "captures" : [ ] } }
{ "_id" : 2, "name" : "Belle Gium", "details" : "belle.gium@example.com", "regexemail" : { "match" : "belle.gium@example.com", "idx" : 0, "captures" : [ ] }, "regexphone" : null }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : "+855-012-000-0000", "regexemail" : null, "regexphone" : { "match" : "+855-012-000-0000", "idx" : 0, "captures" : [ ] } }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : "cam.bo.dia@example.com", "regexemail" : { "match" : "cam.bo.dia@example.com", "idx" : 0, "captures" : [ ] }, "regexphone" : null }
{ "_id" : 4, "name" : "Fred", "details" : "+1-111-222-3333", "regexemail" : null, "regexphone" : { "match" : "+1-111-222-3333", "idx" : 0, "captures" : [ ] } }
세 번째 단계

이 단계에서는 $project 단계를 사용하여 _id 필드, name 필드 및 details 필드가 있는 문서를 출력합니다. details 필드는 emailphone 필드가 있는 문서로 설정되며, 그 값은 regexemailregexphone 필드에서 결정됩니다.

{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "phone" : "+672-19-9999" } }
{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "email" : "aunt.arc.tica@example.com" } }
{ "_id" : 2, "name" : "Belle Gium", "details" : { "phone" : "+32-2-111-11-11" } }
{ "_id" : 2, "name" : "Belle Gium", "details" : { "email" : "belle.gium@example.com" } }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : { "phone" : "+855-012-000-0000" } }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : { "email" : "cam.bo.dia@example.com" } }
{ "_id" : 4, "name" : "Fred", "details" : { "phone" : "+1-111-222-3333" } }
4단계

이 단계에서는 $group 단계를 사용하여 입력 문서를 _id 값에 따라 그룹화합니다. 이 단계에서는 $mergeObjects 표현식을 사용하여 details 문서를 병합합니다.

{ "_id" : 3, "name" : "Cam Bo Dia", "details" : { "phone" : "+855-012-000-0000", "email" : "cam.bo.dia@example.com" } }
{ "_id" : 4, "name" : "Fred", "details" : { "phone" : "+1-111-222-3333" } }
{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "phone" : "+672-19-9999", "email" : "aunt.arc.tica@example.com" } }
{ "_id" : 2, "name" : "Belle Gium", "details" : { "phone" : "+32-2-111-11-11", "email" : "belle.gium@example.com" } }
다섯 번째 단계

이 단계에서는 $sort 단계를 사용하여 _id 필드를 기준으로 문서를 정렬합니다.

{ "_id" : 1, "name" : "Aunt Arc Tikka", "details" : { "phone" : "+672-19-9999", "email" : "aunt.arc.tica@example.com" } }
{ "_id" : 2, "name" : "Belle Gium", "details" : { "phone" : "+32-2-111-11-11", "email" : "belle.gium@example.com" } }
{ "_id" : 3, "name" : "Cam Bo Dia", "details" : { "phone" : "+855-012-000-0000", "email" : "cam.bo.dia@example.com" } }
{ "_id" : 4, "name" : "Fred", "details" : { "phone" : "+1-111-222-3333" } }

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

db.employees.insertMany([
{ "_id" : 1, name: "Aunt Arc Tikka", "email" : "aunt.tica@example.com" },
{ "_id" : 2, name: "Belle Gium", "email" : "belle.gium@example.com" },
{ "_id" : 3, name: "Cam Bo Dia", "email" : "cam.dia@example.com" },
{ "_id" : 4, name: "Fred" }
])

직원 이메일의 형식은 <firstname>.<lastname>@example.com입니다. $regexFind 결과에서 반환되는 captured 필드를 사용하여 직원의 사용자 이름을 구문 분석할 수 있습니다.

db.employees.aggregate( [
{ $addFields: {
"username": { $regexFind: { input: "$email", regex: /^([a-z0-9_.+-]+)@[a-z0-9_.+-]+\.[a-z0-9_.+-]+$/, options: "i" } },
} },
{ $set: { username: { $arrayElemAt: [ "$username.captures", 0 ] } } }
] )
첫 번째 단계

이 단계에서는 $addFields 단계를 사용하여 문서에 새 필드 username 을 추가합니다. 새 필드는 email 필드에 $regexFind를 수행한 결과를 포함합니다.

{ "_id" : 1, "name" : "Aunt Arc Tikka", "email" : "aunt.tica@example.com", "username" : { "match" : "aunt.tica@example.com", "idx" : 0, "captures" : [ "aunt.tica" ] } }
{ "_id" : 2, "name" : "Belle Gium", "email" : "belle.gium@example.com", "username" : { "match" : "belle.gium@example.com", "idx" : 0, "captures" : [ "belle.gium" ] } }
{ "_id" : 3, "name" : "Cam Bo Dia", "email" : "cam.dia@example.com", "username" : { "match" : "cam.dia@example.com", "idx" : 0, "captures" : [ "cam.dia" ] } }
{ "_id" : 4, "name" : "Fred", "username" : null }
두 번째 단계

이 단계는 $set 단계를 사용해 username"$username.captures" 배열의 0번째 요소로 재설정합니다. username의 현재 값이 null이면 username의 새로운 값도 null로 설정됩니다.

{ "_id" : 1, "name" : "Aunt Arc Tikka", "email" : "aunt.tica@example.com", "username" : "aunt.tica" }
{ "_id" : 2, "name" : "Belle Gium", "email" : "belle.gium@example.com", "username" : "belle.gium" }
{ "_id" : 3, "name" : "Cam Bo Dia", "email" : "cam.dia@example.com", "username" : "cam.dia" }
{ "_id" : 4, "name" : "Fred", "username" : null }

다음도 참조하세요.

captures 배열 의 동작에 대한 자세한 내용과 추가 예제는 captures 출력 동작을 참조하세요.

돌아가기

$reduce

이 페이지의 내용