빌더 업데이트
이 페이지의 내용
개요
이 가이드 에서는 MongoDB 코틀린 (Kotlin) 드라이버 에서 빌더 를 사용하여 업데이트 를 지정하는 방법을 학습 수 있습니다.
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 ( 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
업데이트 작업에서 필드 값을 삭제하려면 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() 메서드를 사용합니다.
다음 예제에서는 5
인 qty
필드의 값을 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() 메서드를 사용합니다.
다음 예시에서는 5
인 qty
필드의 값에 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
업데이트 작업에서 필드 값의 이름을 변경하려면 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
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() 메서드를 사용하여 업데이트 작업에서 필드의 정수 값에 대한 비트 단위 업데이트를 수행합니다.
다음 예시에서는 숫자 10
와 qty
필드의 정수 값(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" } }
Array Updates
세트에 추가
업데이트 작업에 값이 아직 없는 경우 배열에 값을 추가하려면 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" } }