Docs Menu
Docs Home
/ / /
Kotlin 코루틴
/ /

빌더 업데이트

이 페이지의 내용

  • 개요
  • 필드 업데이트
  • 세트
  • Unset
  • 삽입 시 설정
  • 증가
  • 곱하기
  • rename
  • Min
  • 최대
  • 현재 날짜
  • 현재 타임스탬프
  • 비트
  • Array Updates
  • 세트에 추가
  • 모두 가져오기
  • 당기기
  • 푸시
  • 여러 업데이트 연산자 결합

이 가이드 에서는 MongoDB 코틀린 (Kotlin) 드라이버 에서 빌더 를 사용하여 업데이트 를 지정하는 방법을 학습 수 있습니다.

Updates 빌더는 다음 유형의 업데이트에 대한 헬퍼 메서드를 제공합니다.

  • 필드 업데이트

  • Array Updates

  • 여러 업데이트 연산자 결합

업데이트를 기대하는 몇 가지 방법은 다음과 같습니다.

  • updateOne()

  • updateMany()

  • bulkWrite()

Updates 클래스는 모든 MongoDB 쿼리 연산자에 대한 정적 팩토리 메서드를 제공합니다. 각 메서드는 BSON 유형의 인스턴스를 반환하며, 이 인스턴스는 업데이트 인수가 필요한 모든 메서드에 전달할 수 있습니다.

간결성을 위해 업데이트 의 메서드를 가져오도록 선택할 수 있습니다. 클래스:

import com.mongodb.client.model.Updates.*

이 가이드의 예시에서는 다음 문서를 사용합니다.

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

이 예제는 달리 명시되지 않는 한 다음 데이터 클래스로 모델링되었습니다.

data class PaintOrder (
@BsonId val id: Int,
val color: String,
val qty: Int?,
val vendor: List<Vendor>?,
val lastModified: LocalDateTime?
)
data class Vendor (
val name: String,
)

업데이트 작업에서 필드 값을 할당하려면 set() 메서드를 사용합니다.

다음 예에서는 qty 필드의 값을 11 로 설정합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.set(PaintOrder::qty.name, 11)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 11,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에서 필드 값을 삭제하려면 unset() 메서드를 사용합니다.

다음 예시에서는 qty 필드를 삭제합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.unset(PaintOrder::qty.name)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

문서의 삽입에 대한 업데이트 작업에서 필드 값을 할당하려면 setOnInsert() 메서드를 사용합니다.

다음 예에서는 작업으로 인해 문서가 삽입된 경우 color 필드의 값을 "pink" 로 설정합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.setOnInsert(PaintOrder::color.name, "pink")
collection.updateOne(filter, update, UpdateOptions().upsert(true))

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "pink"
}

참고

문서를 삽입하지 않으면 변경 사항이 적용되지 않습니다.

업데이트 작업에서 숫자 필드의 값을 증가시키려면 inc() 메서드를 사용합니다.

다음 예제에서는 5qty 필드의 값을 3 씩 증가시킵니다.

val filter = Filters.eq("_id", 1)
val update = Updates.inc(PaintOrder::qty.name, 3)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 8,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에서 숫자 필드의 값을 곱하려면 mul() 메서드를 사용합니다.

다음 예시에서는 5qty 필드의 값에 2 를 곱합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.mul(PaintOrder::qty.name, 2)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 10,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에서 필드 값의 이름을 변경하려면 rename() 메서드를 사용합니다.

다음 예에서는 qty 필드의 이름을 quantity 로 바꿉니다.

val filter = Filters.eq("_id", 1)
val update = Updates.rename(PaintOrder::qty.name, "quantity")
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" },
"quantity": 5,
}

min() 메서드를 설정하다 하여 지정된 값이 필드 의 현재 값보다 작은 경우 필드 값을 지정된 값으로 설정합니다.

다음 예에서는 2 이(가) qty 필드(5)의 현재 값보다 작으므로 qty 필드를 2 로 업데이트합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.min(PaintOrder::qty.name, 2)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 2,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에서 지정된 두 값 중 더 큰 값으로 필드 값을 업데이트하려면 max() 메서드를 사용합니다.

다음 예에서는 8 이(가) qty 필드의 현재 값(5)보다 크므로 qty 필드를 8 로 업데이트합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.max(PaintOrder::qty.name, 8)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 8,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

currentDate() 사용 메서드를 사용하여 업데이트 작업의 필드 값을 현재 날짜에 BSON 날짜로 할당합니다.

다음 예시에서는 lastModified 필드의 값을 현재 날짜(BSON 날짜)로 설정합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.currentDate(PaintOrder::lastModified.name)
collection.updateOne(filter, update)

이 페이지를 2023년 6월 16일에 작성했으므로, 앞의 예제에서는 원본 문서를 다음 상태로 업데이트합니다.

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"$date": "2023-06-16T17:13:06.373Z"
}

currentTimestamp() 사용 메서드를 사용하여 업데이트 작업의 필드 값을 현재 날짜에 타임스탬프로 할당합니다.

다음 예시에서는 lastModified 필드의 값을 현재 날짜(BSON 타임스탬프)로 설정합니다.

// Create a new instance of the collection with the flexible `Document` type
// to allow for the changing of the `lastModified` field to a `BsonTimestamp`
// from a `LocalDateTime`.
val collection = database.getCollection<Document>("paint_orders")
val filter = Filters.eq("_id", 1)
val update = Updates.currentTimestamp(PaintOrder::lastModified.name)
collection.updateOne(filter, update)

이 페이지를 2023년 6월 16일에 작성했으므로, 앞의 예제에서는 원본 문서를 다음 상태로 업데이트합니다.

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"$timestamp": { "t": 1686935654, "i": 3 }
}

bitwiseOr() 사용 , bitwiseAnd()bitwiseXor() 메서드를 사용하여 업데이트 작업에서 필드의 정수 값에 대한 비트 단위 업데이트를 수행합니다.

다음 예시에서는 숫자 10qty 필드의 정수 값(5) 간에 비트 OR 를 수행합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.bitwiseOr(PaintOrder::qty.name, 10)
collection.updateOne(filter, update)

비트 연산은 15 이 됩니다.

0101 // bit representation of 5
1010 // bit representation of 10
----
1111 // bit representation of 15

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 15,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에 값이 아직 없는 경우 배열에 값을 추가하려면 addToSet() 메서드를 사용합니다.

다음 예제에서는 name 값이 "C"Vendor 인스턴스를 vendor 배열에 추가합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.addToSet(PaintOrder::vendor.name, Vendor("C"))
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" },
{ "name": "C" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에서 배열의 첫 번째 요소를 제거하려면 popFirst() 메서드를 사용하고, 배열의 마지막 요소를 제거하려면 popLast() 메서드를 사용합니다.

다음 예에서는 vendor 배열의 첫 번째 항목을 제거합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.popFirst(PaintOrder::vendor.name)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "D" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

pullAll() 메서드를 사용하여 업데이트 작업에서 기존 배열 에서 지정된 값의 모든 인스턴스를 제거 합니다.

다음 예제에서는 vendor 배열에서 name 값이 "A""M"Vendor 인스턴스를 제거합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.pullAll(PaintOrder::vendor.name, listOf(Vendor("A"), Vendor("M")))
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "D" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

pull() 사용 메서드를 사용하여 업데이트 작업에서 기존 배열에서 지정된 값의 모든 인스턴스를 제거합니다.

다음 예제에서는 name 값이 "D"Vendor 인스턴스를 vendor 배열에서 제거합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.pull(PaintOrder::vendor.name, Vendor("D"))
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "A" },
{ "name": "M" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

업데이트 작업에서 배열에 값을 추가하려면 push() 메서드를 사용합니다.

다음 예제에서는 name 값이 "Q"Vendor 인스턴스를 vendor 배열에 추가합니다.

val filter = Filters.eq("_id", 1)
val update = Updates.push(PaintOrder::vendor.name, Vendor("Q"))
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "red",
"qty": 5,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" },
{ "name": "Q" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

애플리케이션은 이전 섹션에서 설명한 두 개 이상의 업데이트 연산자를 결합하여 단일 문서의 여러 필드를 업데이트할 수 있습니다.

다음 예시에서는 qty 필드의 값을 6 만큼 증가시키고 color 필드의 값을 "purple" 로 설정한 다음, name 값이 "R"Vendor 인스턴스를 다음에 추가합니다. vendor 필드:

val filter = Filters.eq("_id", 1)
val update = Updates.combine(
Updates.set(PaintOrder::color.name, "purple"),
Updates.inc(PaintOrder::qty.name, 6),
Updates.push(PaintOrder::vendor.name, Vendor("R"))
)
collection.updateOne(filter, update)

앞의 예에서는 원본 문서를 다음 상태로 업데이트합니다:

{
"_id": 1,
"color": "purple",
"qty": 11,
"vendor": [
{ "name": "A" },
{ "name": "D" },
{ "name": "M" },
{ "name": "R" }
],
"lastModified": { "$date": "2000-01-01T07:00:00.000Z" }
}

돌아가기

정렬 빌더