집계 표현식 연산
개요
이 가이드 에서는 코틀린 동기 (Kotlin Sync) 운전자 를 사용하여 집계 파이프라인에 사용할 표현식을 구성하는 방법을 학습 수 있습니다. BSON 문서를 사용하는 대신 검색 가능하고 형식이 안전한 코틀린 (Kotlin) 메서드를 사용하여 표현식 작업을 수행할 수 있습니다. 이러한 메서드는 유창한 인터페이스 패턴 을 따르기 때문에 집계 작업을 함께 연결하여 간결하고 자연스럽게 읽을 수 있는 코드를 만들 수 있습니다.
이 가이드의 작업에서는 com.mongodb.client.model.mql 의 메서드를 사용합니다. 패키지. 이러한 메서드는 드라이버가 MongoDB deployment와 상호 작용하는 메커니즘인 Query API를 사용하는 관용적인 방법을 제공합니다. Query API 에 대해 자세히 알아보려면 MongoDB Server 매뉴얼 문서를 참조하세요.
작업 사용 방법
이 가이드의 예시에서는 코드에 다음 가져오기가 포함되어 있다고 가정합니다.
import com.mongodb.client.model.Aggregates import com.mongodb.client.model.Accumulators import com.mongodb.client.model.Projections import com.mongodb.client.model.Filters import com.mongodb.client.model.mql.MqlValues
표현식 의 문서 필드에 액세스 하려면 current()
메서드를 사용하여 집계 파이프라인 에서 처리 중인 현재 문서 를 참조해야 합니다. 필드 값에 액세스 하려면 getString()
또는 getDate()
와 같이 적절한 유형의 메서드를 사용해야 합니다. 필드 의 유형을 지정할 때 운전자 가 해당 유형과 호환되는 메서드만 제공하는지 확인해야 합니다. 다음 코드는 name
라는 string 필드 를 참조하는 방법을 보여줍니다.
current().getString("name")
작업에서 값을 지정하려면 of()
생성자 메서드에 값을 전달하여 올바른 형식으로 변환해야 합니다. 다음 코드에서는 1.0
값을 참조하는 방법을 보여줍니다.
of(1.0)
작업을 생성하려면 메서드를 필드 또는 값 참조에 연결합니다. 여러 메서드를 연결하여 더 복잡한 작업을 빌드 할 수 있습니다.
다음 예에서는 뉴멕시코에서 의사 사무실을 한 번 이상 방문한 적이 있는 환자를 찾는 작업을 만듭니다. 이 작업은 아래의 조치를 수행합니다.
gt()
메서드를 사용하여visitDates
배열 값의 크기가0
보다 큰지 확인합니다.eq()
메서드를 사용하여state
필드 값이 'New Mexico'인지 확인합니다.
and()
메서드는 파이프라인 단계가 두 기준을 모두 충족하는 문서만 일치하도록 이러한 작업을 연결합니다.
current() .getArray("visitDates") .size() .gt(of(0)) .and(current() .getString("state") .eq(of("New Mexico")))
group()
과 같은 일부 집계 단계에서는 작업을 직접 수행할 수 있지만, 다른 단계에서는 computed()
또는 expr()
와 같은 메서드에 작업을 먼저 포함해야 합니다. TExpression
유형의 값을 사용하는 이러한 메서드에서는 특정 집계에서 표현식을 사용할 수 있습니다.
집계 파이프라인 단계를 완료하려면 Aggregates 빌더 메서드에 표현식을 포함하세요. 다음 목록은 일반 Aggregates 빌더 메서드에 표현식을 포함하는 방법의 예를 보여줍니다.
match(expr(<expression>))
project(fields(computed("<field name>", <expression>)))
group(<expression>)
이러한 메서드에 학습 보려면 애그리게이션을 사용하여 데이터 변환 가이드 를 참조하세요.
생성자 메서드
이러한 생성자 메서드를 사용하여 코틀린 집계 표현식에 사용할 값을 정의할 수 있습니다.
메서드 | 설명 |
---|---|
집계 파이프라인에서 처리 중인 현재 문서를 참조합니다. | |
집계 파이프라인에서 처리 중인 현재 문서를 맵 값으로 참조합니다. | |
제공된 프리미티브에 해당하는 MqlValue 유형을 반환합니다. | |
제공된 프리미티브 배열에 해당하는 MqlValue 유형의 배열을 반환합니다. | |
항목 값을 반환합니다. | |
빈 맵 값을 반환합니다. | |
Query API에 존재하는 null 값을 반환합니다. |
중요
이러한 메서드 중 하나에 값을 제공하면 드라이버는 이를 문자 그대로 처리합니다. 예를 들어 of("$x")
는 x
라는 필드가 아니라 문자열 값 "$x"
를 나타냅니다.
이러한 메서드를 사용하는 예제는 작업 섹션을 참조하세요.
운영
다음 섹션에서는 드라이버에서 사용할 수 있는 집계 표현식 작업에 대한 정보와 예를 제공합니다. 작업은 용도와 기능에 따라 분류됩니다.
각 섹션에는 운전자 에서 사용할 수 있는 집계 메서드와 Query API 의 해당 표현식 연산자를 설명하는 표가 있습니다. 메서드 이름은 API 문서에 연결되고 집계 파이프라인 연산자 이름은 서버 매뉴얼 문서의 설명 및 예제에 연결됩니다. 각 메서드는 해당 집계 연산자 와 사실상 동일하지만 예상되는 매개 변수 및 구현 이 다를 수 있습니다.
각 섹션의 예시 에서는 listOf()
메서드를 사용하여 집계 단계에서 파이프라인 을 만듭니다. 그런 다음 각 예시 는 파이프라인 을 MongoCollection
의 aggregate()
메서드에 전달합니다.
참고
드라이버는 각 예에 제공된 Query API 표현식과 다를 수 있는 Query API 표현식을 생성합니다. 그러나 두 표현식 모두 동일한 집계 결과를 만듭니다.
중요
운전자 는 Query API 의 모든 집계 파이프라인 연산자에 대한 메서드를 제공하지 않습니다. 집계 에서 지원되지 않는 작업을 사용하려면 BSON Document
유형을 사용하여 전체 표현식 을 정의해야 합니다.
산술 작업
이 섹션에 설명된 메서드를 사용하여 MqlInteger
또는 MqlNumber
유형의 값에 산술 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
각 날짜의 강수량 측정값(인치)이 포함된 특정 연도의 날씨 데이터가 있다고 가정해 보겠습니다. 각 월의 평균 강수량을 밀리미터 단위로 구하려고 합니다.
multiply()
연산자 는 precipitation
필드 에 25.4
를 곱하여 필드 값을 밀리미터로 변환합니다. avg()
축적자 메서드는 평균을 avgPrecipMM
필드 로 반환합니다. group()
메서드는 각 문서의 date
필드 에 지정된 월별로 값을 그룹화합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val month = current().getDate("date").month(of("UTC")) val precip = current().getInteger("precipitation") val results = collection.aggregate<Document>( listOf( Aggregates.group( month, Accumulators.avg("avgPrecipMM", precip.multiply(25.4)) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $group: { _id: { $month: "$date" }, avgPrecipMM: { $avg: { $multiply: ["$precipitation", 25.4] } } } } ]
배열 작업
이 섹션에 설명된 메서드를 사용하여 MqlArray
유형의 값에 배열 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
영화 컬렉션이 있다고 가정해 보겠습니다. 각 컬렉션에는 예정된 상영 시간에 대한 중첩된 문서 배열이 포함되어 있습니다. 각 중첩 문서에는 극장의 총 좌석 수를 나타내는 배열이 포함되어 있습니다. 여기서 첫 번째 배열 항목은 프리미엄 좌석 수이고 두 번째 항목은 일반 좌석 수입니다. 중첩된 각 문서에는 상영 시간 동안 이미 구매한 티켓 수도 포함됩니다. 이 컬렉션의 문서는 다음과 비슷합니다.
{ "_id": ..., "movie": "Hamlet", "showtimes": [ { "date": "May 14, 2023, 12:00 PM", "seats": [ 20, 80 ], "ticketsBought": 100 }, { "date": "May 20, 2023, 08:00 PM", "seats": [ 10, 40 ], "ticketsBought": 34 }] }
filter()
메서드는 제공된 조건자와 일치하는 결과만 표시합니다. 이 경우 조건자는 sum()
를 사용하여 총 좌석 수를 계산하고 lt()
메서드를 통해 해당 값을 ticketsBought
수와 비교합니다. project()
메서드는 이러한 필터링된 결과를 새 availableShowtimes
배열 필드 로 저장합니다.
팁
getArray()
메서드를 사용하여 특정 유형의 값으로 작업할 때 배열 에 포함된 값의 유형을 지정해야 합니다. 예를 예시 , 애플리케이션 의 다른 곳에서 정수를 사용하여 계산을 수행하려면 배열 에 정수가 포함되도록 지정해야 합니다.
이 섹션의 예시 에서는 각 배열 항목에서 중첩된 필드를 추출할 수 있도록 seats
배열 에 MqlDocument
유형의 값이 포함되도록 지정합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val showtimes = current().getArray<MqlDocument>("showtimes") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed("availableShowtimes", showtimes .filter { showtime -> val seats = showtime.getArray<MqlInteger>("seats") val totalSeats = seats.sum { n -> n } val ticketsBought = showtime.getInteger("ticketsBought") val isAvailable = ticketsBought.lt(totalSeats) isAvailable }) ) ) ) )
참고
가독성을 높이기 위해 이전 예시 에서는 totalSeats
및 isAvailable
변수에 중간 값을 할당합니다. 이러한 중간 값을 변수에 할당하지 않으면 코드는 여전히 동일한 결과를 생성합니다.
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { availableShowtimes: { $filter: { input: "$showtimes", as: "showtime", cond: { $lt: [ "$$showtime.ticketsBought", { $sum: "$$showtime.seats" } ] } } } } } ]
부울 작업
이 섹션에 설명된 메서드를 사용하여 MqlBoolean
유형의 값에 부울 작업을 수행할 수 있습니다.
매우 낮거나 높은 기상 온도 측정값(화씨 단위)을 극한으로 분류한다고 가정해 보겠습니다.
or()
연산자 는 lt()
및 gt()
메서드를 사용하여 temperature
필드 를 사전 정의된 값과 비교하여 온도가 극한인지 확인합니다. project()
메서드는 이 결과를 extremeTemp
필드 에 기록합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val temperature = current().getInteger("temperature") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed( "extremeTemp", temperature .lt(of(10)) .or(temperature.gt(of(95))) ) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { extremeTemp: { $or: [ { $lt: ["$temperature", 10] }, { $gt: ["$temperature", 95] } ] } } } ]
비교 작업
이 섹션에 설명된 메서드를 사용하여 MqlValue
유형의 값에 비교 작업을 수행할 수 있습니다.
팁
cond()
메서드는 코틀린 (Kotlin) 의 삼항 연산자 와 유사하며 부울 값을 기반으로 하는 간단한 분기에 사용할 수 있습니다. 값 유형에 패턴 일치를 수행하거나 값에 대한 기타 임의 검사를 수행하는 등 더 복잡한 비교에는 switchOn()
메서드를 사용합니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
다음 예에서는 location
필드의 값이 "California"
인 모든 문서와 일치하는 파이프라인을 보여줍니다.
val location = current().getString("location") val results = collection.aggregate<Document>( listOf( Aggregates.match( Filters.expr(location.eq(of("California"))) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $match: { location: { $eq: "California" } } } ]
조건부 작업
이 섹션에 설명된 메서드를 사용하여 조건부 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
멤버십 정보가 포함된 고객 컬렉션이 있다고 가정해 보겠습니다. 해당 고객들은 원래 회원이었거나 비회원이었습니다. 시간이 지나면서 멤버십 등급이 도입되어 동일한 필드를 사용하게 되었습니다. 이 필드에 저장된 정보는 몇 가지 유형 중 하나일 수 있으며, 멤버십 등급을 나타내는 표준화된 값을 만들려고 합니다.
switchOn()
메서드는 각 절을 순서대로 확인합니다. 값이 절에 표시된 유형과 일치하면 절에 따라 멤버십 등급에 해당하는 string 값이 결정됩니다. 원래 값이 string 인 경우 멤버십 등급을 나타내며 해당 값이 사용됩니다. 데이터 유형 이 부울인 경우 멤버십 등급에 대해 Gold
또는 Guest
를 반환합니다. 데이터 유형 이 배열 인 경우 배열 에서 가장 최근 멤버십 등급과 일치하는 가장 최근 string 을 반환합니다. member
필드 가 알 수 없는 유형인 경우 switchOn()
메서드는 Guest
의 기본값 을 제공합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val member = current().getField("member") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed("membershipLevel", member.switchOn { field -> field .isString { s -> s } .isBoolean { b -> b.cond(of("Gold"), of("Guest")) } .isArray { a -> a.last() } .defaults { d -> of("Guest") } }) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { membershipLevel: { $switch: { branches: [ { case: { $eq: [ { $type: "$member" }, "string" ] }, then: "$member" }, { case: { $eq: [ { $type: "$member" }, "bool" ] }, then: { $cond: { if: "$member", then: "Gold", else: "Guest" } } }, { case: { $eq: [ { $type: "$member" }, "array" ] }, then: { $last: "$member" } } ], default: "Guest" } } } } ]
편의성 작업
이 섹션에 설명된 메서드를 사용하여 MqlValue
유형의 값에 사용자 정의 함수를 적용할 수 있습니다.
가독성을 높이고 코드를 재사용할 수 있도록 하려면 중복 코드를 정적 메서드로 이동하면 됩니다. 그러나 코틀린 (Kotlin) 에서는 정적 메서드를 직접 연결할 수 없습니다. passTo()
메서드를 사용하면 값을 사용자 지정 정적 메서드에 연결할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
해당 연산자 없음 |
특정 벤치마크에 대해 학급의 성과를 확인하고 싶다고 가정해 보겠습니다. 각 학급의 평균 최종 성적을 찾아 벤치마크 값과 비교하려고 합니다.
다음 사용자 정의 메서드 gradeAverage()
는 해당 문서에서 공유되는 정수 필드의 이름과 문서 배열을 사용합니다. 제공된 배열의 모든 문서에서 해당 필드의 평균을 계산하고 제공된 배열의 모든 요소에서 해당 필드의 평균을 결정합니다. evaluate()
메서드는 제공된 값을 제공된 두 범위 한도와 비교하고 값이 비교되는 방식에 따라 응답 문자열을 생성합니다.
fun gradeAverage(students: MqlArray<MqlDocument>, fieldName: String): MqlNumber { val sum = students.sum { student -> student.getInteger(fieldName) } val avg = sum.divide(students.size()) return avg } fun evaluate(grade: MqlNumber, cutoff1: MqlNumber, cutoff2: MqlNumber): MqlString { val message = grade.switchOn { on -> on .lte(cutoff1) { g -> of("Needs improvement") } .lte(cutoff2) { g -> of("Meets expectations") } .defaults { g -> of("Exceeds expectations") } } return message }
팁
passTo()
메서드를 사용하면 다른 애그리게이션에 사용자 지정 메서드를 재사용할 수 있습니다. 예를 예시 gradeAverage()
메서드를 사용하여 학급뿐만 아니라 입학 연도 또는 학군별로 필터링된 학생 그룹의 평균 성적을 찾을 수 있습니다. 마찬가지로 evaluate()
메서드를 사용하여 개별 학생의 성과나 전체 학교의 성과를 평가할 수 있습니다.
passArrayTo()
메서드는 모든 학생의 배열 을 가져와서 gradeAverage()
메서드를 사용하여 평균 점수를 계산합니다. 그런 다음 passNumberTo()
메서드는 evaluate()
메서드를 사용하여 클래스의 성과를 확인합니다. 이 예시 에서는 project()
메서드를 사용하여 결과를 evaluation
필드 로 저장합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val students = current().getArray<MqlDocument>("students") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed("evaluation", students .passArrayTo { s -> gradeAverage(s, "finalGrade") } .passNumberTo { grade -> evaluate(grade, of(70), of(85)) }) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { evaluation: { $switch: { branches: [ { case: { $lte: [ { $avg: "$students.finalGrade" }, 70 ] }, then: "Needs improvement" }, { case: { $lte: [ { $avg: "$students.finalGrade" }, 85 ] }, then: "Meets expectations" } ], default: "Exceeds expectations" } } } } ]
변환 작업
이 섹션에 설명된 메서드를 사용하여 특정 MqlValue
유형들을 상호 변환하는 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
해당 연산자 없음 | |
해당 연산자 없음 | |
졸업 연도가 포함된 학생 데이터 컬렉션을 만들고 싶다고 가정해 보겠습니다. 이 데이터 컬렉션은 문자열로 저장됩니다. 5년 만의 동창회 연도를 계산하고 이 값을 새 필드에 저장하려고 합니다.
parseInteger()
메서드는 graduationYear
를 정수로변환하여 add()
가 동창회 연도를 계산할 수 있도록 합니다. addFields()
메서드는 이 결과를 새 reunionYear
필드로 저장합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val students = current().getArray<MqlDocument>("students") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed("evaluation", students .passArrayTo { s -> gradeAverage(s, "finalGrade") } .passNumberTo { grade -> evaluate(grade, of(70), of(85)) }) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $addFields: { reunionYear: { $add: [ { $toInt: "$graduationYear" }, 5 ] } } } ]
날짜 작업
이 섹션에 설명된 메서드를 사용하여 MqlDate
유형의 값에 날짜 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
패키지 배송에 대한 데이터가 있고 "America/New_York"
구역의 어느 월요일에 발생한 배송을 일치시키려고 한다고 가정해 보겠습니다.
deliveryDate
필드에 "2018-01-15T16:00:00Z"
또는 "Jan 15, 2018, 12:00
PM EST"
등과 같은 유효한 날짜를 나타내는 문자열 값이 포함되어 있는 경우 parseDate()
메서드를 사용하여 문자열을 날짜 유형으로 변환할 수 있습니다.
dayOfWeek()
메서드는 날짜가 속한 요일을 확인한 다음 숫자로 변환합니다. "America/New_York"
시간대를 사용할 때 번호 할당은 일요일을 MEAN 하기 위해 0
을 사용합니다. eq()
메서드는 이 값을 2
또는 월요일과 비교합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val deliveryDate = current().getString("deliveryDate") val results = collection.aggregate<Document>( listOf( Aggregates.match( Filters.expr( deliveryDate .parseDate() .dayOfWeek(of("America/New_York")) .eq(of(2)) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $match: { $expr: { $eq: [ { $dayOfWeek: { date: { $dateFromString: { dateString: "$deliveryDate" } }, timezone: "America/New_York" }}, 2 ] } } } ]
문서 작업
이 섹션에 설명된 메서드를 사용하여 MqlDocument
유형의 값에 문서 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
해당 연산자 없음 | |
mailing.address
필드 아래에 하위 문서로 주소가 포함된 레거시 고객 데이터 컬렉션 이 있다고 가정해 보겠습니다. 워싱턴 상태 에 거주하는 모든 고객을 찾으려고 합니다. 이 컬렉션 의 문서 는 다음과 유사할 수 있습니다.
{ "_id": ..., "customer.name": "Mary Kenneth Keller", "mailing.address": { "street": "601 Mongo Drive", "city": "Vasqueztown", "state": "CO", "zip": 27017 } }
getDocument()
메서드는 mailing.address
필드를 문서로 검색하므로 getString()
메서드를 사용하여 중첩된 state
필드를 조회할 수 있습니다. eq()
메서드는 state
필드의 값이 "WA"
인지 확인합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val address = current().getDocument("mailing.address") val results = collection.aggregate<Document>( listOf( Aggregates.match( Filters.expr( address .getString("state") .eq(of("WA")) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $match: { $expr: { $eq: [{ $getField: { input: { $getField: { input: "$$CURRENT", field: "mailing.address"}}, field: "state" }}, "WA" ] }}}]
맵 작업
이 섹션에 설명된 메서드를 사용하여 MqlMap
또는 MqlEntry
유형의 값에 맵 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 |
각 문서 가 공급 책임이 있는 개별 품목을 나타내는 재고 데이터 컬렉션 이 있다고 가정해 보겠습니다. 각 문서 에는 모든 창고의 맵과 해당 품목의 재고에 있는 사본 수를 나타내는 필드 가 포함되어 있습니다. 모든 창고에 보유하고 있는 품목의 총 사본 수를 확인하려고 합니다. 이 컬렉션 의 문서 는 다음과 유사할 수 있습니다.
{ "_id": ..., "item": "notebook" "warehouses": [ { "Atlanta", 50 }, { "Chicago", 0 }, { "Portland", 120 }, { "Dallas", 6 } ] }
entries()
메서드는 warehouses
필드에 있는 맵 항목을 배열로 반환합니다. sum()
메서드는 getValue()
메서드를 통해 조회된 배열의 값을 기반으로 품목의 총 값을 계산합니다. 이 예에서는 project()
메서드를 사용하여 결과를 새 totalInventory
필드로 저장합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val warehouses = current().getMap<MqlNumber>("warehouses") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed("totalInventory", warehouses .entries() .sum { v -> v.getValue() }) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { totalInventory: { $sum: { $getField: { $objectToArray: "$warehouses" }, } } } } ]
문자열 작업
이 섹션에 설명된 메서드를 사용하여 MqlString
유형의 값에 문자열 작업을 수행할 수 있습니다.
메서드 | 집계 파이프라인 연산자 |
---|---|
직원의 성과 직원 ID를 사용하여 회사 직원의 소문자 사용자 이름을 생성한다고 가정해 보겠습니다.
append()
메서드는 lastName
및 employeeID
필드를 단일 사용자 이름에 결합하는 반면 toLower()
메서드는 전체 사용자 이름을 소문자로 만듭니다. 이 예에서는 project()
메서드를 사용하여 결과를 새 username
필드로 저장합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val lastName = current().getString("lastName") val employeeID = current().getString("employeeID") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed( "username", lastName .append(employeeID) .toLower() ) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { username: { $toLower: { $concat: ["$lastName", "$employeeID"] } } } } ]
유형 검사 작업
이 섹션에 설명된 메서드를 사용하여 MqlValue
유형의 값에 유형 검사 작업을 수행할 수 있습니다.
이러한 메서드는 부울 값을 반환하지 않습니다. 대신 메서드에서 지정된 유형과 일치하는 기본값 을 제공합니다. 확인된 값이 메서드 유형과 일치하면 확인된 값이 반환됩니다. 그렇지 않으면 제공된 기본값 이 반환됩니다. 데이터 유형 을 기반으로 분기 로직을 프로그래밍하려면 switchOn()
를 참조하세요.
메서드 | 집계 파이프라인 연산자 |
---|---|
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 | |
해당 연산자 없음 |
평점 데이터 컬렉션이 있다고 가정해 보겠습니다. 리뷰 스키마의 초기 버전에서는 사용자가 별점 없이 부정적인 리뷰를 제출할 수 있었습니다. 별점이 없는 부정적인 리뷰를 최소 별 1개 값으로 변환하려고 합니다.
isNumberOr()
메서드는 rating
값을 반환하거나, rating
이 숫자가 아니거나 null인 경우 1
값을 반환합니다. project()
메서드는 이 값을 새 numericalRating
필드로 반환합니다.
다음 코드에서는 이 집계에 대한 파이프라인을 보여 줍니다.
val rating = current().getField("rating") val results = collection.aggregate<Document>( listOf( Aggregates.project( Projections.fields( Projections.computed( "numericalRating", rating .isNumberOr(of(1)) ) ) ) ) )
다음 코드는 Query API에서 이에 상응하는 집계 파이프라인을 제공합니다.
[ { $project: { numericalRating: { $cond: { if: { $isNumber: "$rating" }, then: "$rating", else: 1 } } } } ]