한 번의 작업으로 삽입 또는 업데이트
개요
이 가이드에서는 MongoDB 코틀린(Kotlin) 드라이버로 업서트 를 수행하는 방법을 배울 수 있습니다.
애플리케이션은 삽입 및 업데이트 작업을 사용하여 데이터를 저장하고 수정합니다. 문서 존재 여부에 따라 삽입과 업데이트 중에서 선택해야 하는 경우도 있습니다. MongoDB는 upsert
옵션을 사용하여 이러한 결정을 간소화합니다.
An upsert
:
쿼리 필터와 일치하는 문서 업데이트
쿼리 필터와 일치하는 문서가 없는 경우 문서를 삽입합니다.
업서트 지정
updateOne()
또는 updateMany()
메서드를 사용하여 업서트를 지정하려면 true
를 UpdateOptions.upsert()
로 전달합니다.
replaceOne()
메서드를 사용하여 업서트를 지정하려면 true
을(를) ReplaceOptions.upsert()
에 전달합니다.
다음 예시에서는 페인트 가게에서 8가지 색상의 페인트를 판매한다고 가정합니다. 해당 가게는 연례 온라인 세일을 진행했습니다. 이제 paint_inventory
컬렉션에 다음 문서가 표시됩니다:
{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 } { "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 } { "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 } { "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 }
이 데이터는 다음 Kotlin 데이터 클래스로 모델링됩니다.
data class PaintOrder( val id: ObjectId = ObjectId(), val qty: Int, val color: String )
매장에서 새로운 물건을 배송받았고 재고를 업데이트해야 합니다. 첫 번째 품목은 주황색 페인트 캔 10개입니다.
재고를 업데이트하려면 color
이 "orange"
인 paint_inventory
컬렉션을 쿼리하고, qty
필드에 10
만큼 increment
하도록 업데이트를 지정한 다음, UpdateOptions.upsert()
를 true
로 지정합니다:
val filter = Filters.eq(PaintOrder::color.name, "orange") val update = Updates.inc(PaintOrder::qty.name, 10) val options = UpdateOptions().upsert(true) val results = collection.updateOne(filter, update, options) println(results)
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{ value=606b4cfc1601f9443b5d6978 }}
이 AcknowledgedUpdateResult
를 통해 다음을 알 수 있습니다:
쿼리 필터와 일치하는 문서 없음
컬렉션에서 수정된 문서가 없습니다.
_id
가606b4cfc1601f9443b5d6978
인 문서가 업서트됨
다음은 paint_inventory
컬렉션에 있는 문서를 보여줍니다:
{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 } { "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 } { "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 } { "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 } { "_id": { "$oid": "606b4cfc1601f9443b5d6978" }, "color": "orange", "qty": 10 }]
참고
UpdateOptions
결과를 포함하지 않으면 컬렉션이 변경되지 않습니다.
val filter = Filters.eq(PaintOrder::color.name, "orange") val update = Updates.inc(PaintOrder::qty.name, 10) val results = collection.updateOne(filter, update) println(results)
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=null }
이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.