문서 메뉴
문서 홈
/ / /
Kotlin 코루틴
/

집계 표현식 연산

이 페이지의 내용

  • 개요
  • 작업 사용 방법
  • 생성자 메서드
  • 운영
  • 산술 작업
  • 배열 작업
  • 부울 작업
  • 비교 작업
  • 조건부 작업
  • 편의성 작업
  • 변환 작업
  • 날짜 작업
  • 문서 작업
  • 맵 작업
  • 문자열 작업
  • 유형 검사 작업

이 가이드에서는 집계 파이프라인에서 사용할 표현식을 구성하기 위해 MongoDB 코틀린 드라이버를 사용하는 방법에 대해 설명합니다. BSON 문서가 아닌 검색 가능하고 형식이 안전한 Java 메서드를 사용하여 표현식 작업을 수행할 수 있습니다. 이러한 메서드는 유창한 인터페이스 패턴을 따르므로 집계 작업을 함께 연결하여, 더 간결하고 자연스럽게 읽을 수 있는 코드를 만들 수 있습니다.

이 가이드의 작업에서는 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이라는 문자열 필드를 참조하는 방법을 보여줍니다.

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>)

이러한 메서드에 대해 자세히 알아보려면 애그리게이션 가이드를 참조하세요.

이 예에서는 listOf() 메서드를 사용하여 애그리게이션 단계 목록을 만듭니다. 이 목록은 MongoCollectionaggregate() 메서드에 전달됩니다.

이러한 생성자 메서드를 사용하여 코틀린 집계 표현식에 사용할 값을 정의할 수 있습니다.

메서드
설명
애그리게이션 파이프라인에서 처리 중인 현재 문서를 참조합니다.
애그리게이션 파이프라인에서 처리 중인 현재 문서를 맵 값으로 참조합니다.
제공된 프리미티브에 해당하는 MqlValue 유형을 반환합니다.
제공된 프리미티브 배열에 해당하는 MqlValue 유형의 배열을 반환합니다.
항목 값을 반환합니다.
빈 맵 값을 반환합니다.
Query API에 존재하는 null 값을 반환합니다.

중요

이러한 메서드 중 하나에 값을 제공하면 드라이버는 이를 문자 그대로 처리합니다. 예를 들어 of("$x")x라는 필드가 아니라 문자열 값 "$x"를 나타냅니다.

이러한 메서드를 사용하는 예를 보려면 작업에 있는 섹션 중 하나를 참조하세요.

다음 섹션에서는 드라이버에서 사용할 수 있는 애그리게이션 표현식 작업에 대한 정보와 예를 제공합니다. 작업은 용도와 기능에 따라 분류됩니다.

각 섹션에는 드라이버에서 사용할 수 있는 집계 메서드와 Query API의 해당 표현식 연산자를 설명하는 표가 있습니다. 메서드 이름은 API 설명서에 연결되고 집계 파이프라인 연산자 이름은 서버 매뉴얼 설명서의 설명 및 예시에 연결됩니다. 각 메서드는 해당 Query API 표현식과 사실상 동일하지만 예상되는 매개변수 및 구현이 다를 수 있습니다.

참고

드라이버는 각 예에 제공된 Query API 표현식과 다를 수 있는 Query API 표현식을 생성합니다. 그러나 두 표현식 모두 동일한 애그리게이션 결과를 만듭니다.

중요

드라이버는 Query API의 모든 애그리게이션 파이프라인 연산자에 대한 메서드를 제공하지 않습니다. 애그리게이션에서 지원되지 않는 작업을 사용해야 하는 경우 BSON Document 유형을 사용하여 전체 표현식을 정의해야 합니다. Document 유형에 대해 알아보려면 문서를 참조하세요.

이 섹션에 설명된 메서드를 사용하여 MqlInteger 또는 MqlNumber 유형의 값에 산술 작업을 수행할 수 있습니다.

매일 강수량 측정값(인치)이 포함된 특정 연도의 날씨 데이터가 있다고 가정해 보겠습니다. 각 월의 평균 강수량을 밀리미터 단위로 구하려고 합니다.

multiply() 연산자는 precipitation 필드에 25.4를 곱하여 값을 밀리미터로 변환합니다. avg() 축적자 메서드는 평균을 avgPrecipMM 필드로 반환합니다. group() 메서드는 각 문서의 date 필드에 지정된 월별로 값을 그룹화합니다.

다음 코드에서는 이 애그리게이션에 대한 파이프라인을 보여 줍니다.

val month = current().getDate("date").month(of("UTC"))
val precip = current().getInteger("precipitation")
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")
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
})
)))

참고

가독성을 높이기 위해 이전 예에서는 totalSeatsisAvailable 변수에 중간 값을 할당합니다. 이러한 중간 값을 변수로 가져오지 않으면 이 코드는 여전히 동일한 결과를 생성합니다.

다음 코드는 Query API에서 이에 상응하는 애그리게이션 파이프라인을 제공합니다.

[ { $project: {
availableShowtimes: {
$filter: {
input: "$showtimes",
as: "showtime",
cond: { $lt: [ "$$showtime.ticketsBought", { $sum: "$$showtime.seats" } ] }
} }
} } ]

이 섹션에 설명된 메서드를 사용하여 MqlBoolean 유형의 값에 부울 작업을 수행할 수 있습니다.

메서드
애그리게이션 파이프라인 연산자

매우 낮거나 높은 기상 온도 측정값(화씨 단위)을 극한으로 분류한다고 가정해 보겠습니다.

or() 연산자는 temperature 필드를 lt()gt()로 사전 정의된 값과 비교하여 온도가 극한인지 확인합니다. project() 메서드는 이 결과를 extremeTemp 필드에 기록합니다.

다음 코드에서는 이 애그리게이션에 대한 파이프라인을 보여 줍니다.

val temperature = current().getInteger("temperature")
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() 메서드는 Java의 3중 연산자와 유사하므로 부울 값을 기반으로 하는 간단한 분기에 사용해야 합니다. 값 유형에 패턴 일치를 수행하거나 값에 대한 기타 임의의 검사를 수행하는 등 보다 복잡한 비교를 하려면 switchOn() 메서드를 사용해야 합니다.

다음 예에서는 location 필드의 값이 "California"인 모든 문서와 일치하는 파이프라인을 보여줍니다.

val location = current().getString("location")
listOf(
Aggregates.match(
Filters.expr(location.eq(of("California")))
))

다음 코드는 Query API에서 이에 상응하는 애그리게이션 파이프라인을 제공합니다.

[ { $match: { location: { $eq: "California" } } } ]

이 섹션에 설명된 메서드를 사용하여 조건부 작업을 수행할 수 있습니다.

멤버십 정보가 포함된 고객 컬렉션이 있다고 가정해 보겠습니다. 해당 고객들은 원래 회원이었거나 비회원이었습니다. 시간이 지나면서 멤버십 등급이 도입되어 동일한 필드를 사용하게 되었습니다. 이 필드에 저장된 정보는 몇 가지 유형 중 하나일 수 있으며, 멤버십 등급을 나타내는 표준화된 값을 만들려고 합니다.

switchOn() 메서드는 각 절을 순서대로 확인합니다. 값이 절에 표시된 유형과 일치하는 경우 이 절에 따라 멤버십 등급에 해당하는 문자열 값이 결정됩니다. 원래 값이 문자열인 경우 멤버십 등급을 나타내며 해당 값이 사용됩니다. 데이터 유형이 부울인 경우 멤버십 등급에 대해 Gold 또는 Guest를 반환합니다. 데이터 유형이 배열인 경우 배열에서 가장 최근 멤버십 등급과 일치하는 가장 최근 문자열을 반환합니다. member 필드가 알 수 없는 유형인 경우 switchOn() 메서드는 기본값인 Guest를 제공합니다.

다음 코드에서는 이 애그리게이션에 대한 파이프라인을 보여 줍니다.

val member = current().getField("member")
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 유형의 값에 사용자 정의 함수를 적용할 수 있습니다.

가독성을 높이고 코드를 재사용할 수 있도록 하려면 중복 코드를 정적 메서드로 이동하면 됩니다. 그러나 코틀린에서는 정적 메서드를 직접 연결하는 것이 불가능합니다. 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")
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 graduationYear = current().getString("graduationYear")
listOf(
Aggregates.addFields(
Field("reunionYear",
graduationYear
.parseInteger()
.add(5))
))

다음 코드는 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" 매개 변수에 따라 월요일을 기준으로 숫자로 변환합니다. eq() 메서드는 제공된 시간대 매개 변수를 기준으로 월요일에 해당하는 2 값과 이 값을 비교합니다.

다음 코드에서는 이 애그리게이션에 대한 파이프라인을 보여 줍니다.

val deliveryDate = current().getString("deliveryDate")
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")
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와 같은 임의의 키를 값에 매핑하는 경우 데이터를 맵으로 표현해야 합니다.

메서드
애그리게이션 파이프라인 연산자
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음
해당 연산자 없음

각각의 문서에 사용자가 제공해야 하는 개별 품목을 나타내는 인벤토리 데이터 컬렉션이 있다고 가정해 보겠습니다. 각 문서에는 모든 창고의 맵과 해당 품목의 현재 인벤토리에 있는 사본 수를 나타내는 필드가 포함되어 있습니다. 모든 창고에 보유하고 있는 품목의 총 사본 수를 확인하려고 합니다. 이 컬렉션의 문서는 다음과 비슷합니다.

{
"_id": ...,
"item": "notebook"
"warehouses": [
{ "Atlanta", 50 },
{ "Chicago", 0 },
{ "Portland", 120 },
{ "Dallas", 6 }
]
}

entries() 메서드는 warehouses 필드에 있는 맵 항목을 배열로 반환합니다. sum() 메서드는 getValue() 메서드를 통해 조회된 배열의 값을 기반으로 품목의 총 값을 계산합니다. 이 예에서는 project() 메서드를 사용하여 결과를 새 totalInventory 필드로 저장합니다.

다음 코드에서는 이 애그리게이션에 대한 파이프라인을 보여 줍니다.

val warehouses = current().getMap<MqlNumber>("warehouses")
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() 메서드는 lastNameemployeeID 필드를 단일 사용자 이름에 결합하는 반면 toLower() 메서드는 전체 사용자 이름을 소문자로 만듭니다. 이 예에서는 project() 메서드를 사용하여 결과를 새 username 필드로 저장합니다.

다음 코드에서는 이 애그리게이션에 대한 파이프라인을 보여 줍니다.

val lastName = current().getString("lastName")
val employeeID = current().getString("employeeID")
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")
listOf(
Aggregates.project(
Projections.fields(
Projections.computed("numericalRating", rating
.isNumberOr(of(1)))
)))

다음 코드는 Query API에서 이에 상응하는 애그리게이션 파이프라인을 제공합니다.

[ { $project: {
numericalRating: {
$cond: { if: { $isNumber: "$rating" },
then: "$rating",
else: 1
} }
} } ]

돌아가기

집계

다음

색인