문서 메뉴
문서 홈
/ / /
Kotlin Sync 드라이버

집계 표현식 연산

이 페이지의 내용

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

이 가이드에서는 Kotlin 동기화 드라이버를 사용하여 집계 파이프라인에서 사용할 표현식을 구성하는 방법을 배울 수 있습니다. 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 문자열 필드를 참조하는 방법을 보여줍니다.

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() 메서드를 사용하여 애그리게이션 단계에서 파이프라인을 만듭니다. 그런 다음 각 예제는 파이프라인을 MongoCollectionaggregate() 메서드에 전달합니다.

참고

드라이버는 각 예에 제공된 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
})
)
)
)
)

참고

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

다음 코드는 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() 메서드는 각 절을 순서대로 확인합니다. 값이 절에 표시된 유형과 일치하면 절에 따라 멤버십 등급에 해당하는 문자열 값이 결정됩니다. 원래 값이 문자열인 경우 멤버십 등급을 나타내며 해당 값이 사용됩니다. 데이터 유형이 부울인 경우 멤버십 등급에 대해 Gold 또는 Guest 를 반환합니다. 데이터 유형이 배열인 경우 배열에서 가장 최근 멤버십 등급과 일치하는 가장 최근 문자열을 반환합니다. 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" 시간대를 사용할 때 번호 할당은 일요일을 의미하기 위해 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() 메서드는 lastNameemployeeID 필드를 단일 사용자 이름에 결합하는 반면 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
} }
} } ]

돌아가기

애그리게이션을 통한 데이터 변환

다음

특수 데이터 형식