Docs Menu
Docs Home
/ / /
Kotlin コルーチン
/ / /

1 回の操作で挿入またはアップデート

項目一覧

  • Overview
  • アップサートの指定

このガイドでは、MongoDB Kotlin ドライバーを使用してアップサートを実行する方法を学習します。

アプリケーションにより、挿入操作と更新操作を使用してデータの保存および変更が行われます。ドキュメントが存在するかどうかに応じて、挿入と更新のどちらかを選択をする必要があります。MongoDB では、 upsertのオプションによって簡単に対応できます。

An upsert:

  • クエリフィルターに一致するドキュメントを更新します

  • クエリフィルターに一致するものがない場合、ドキュメントを挿入します

updateOne()またはupdateMany()メソッドを使用してアップサートを指定するには、 UpdateOptions.upsert()trueを渡します。

replaceOne()メソッドでアップサートを指定するには、ReplaceOptions.upsert()trueを渡します。

次の例では、塗料店で 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(
@BsonId val id: ObjectId = ObjectId(),
val qty: Int,
val color: String
)

店舗で新しい商品を受け取ったので、在庫を更新する必要があります。最初の入荷商品は、オレンジ色の塗料 10 缶です。

在庫をアップデートするには、paint_inventoryコレクションでcolor"orange"になっている箇所をクエリし、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では以下の内容がわかります。

  • クエリフィルターに一致したドキュメントは 0 件でした

  • コレクション内の変更されたドキュメントはありません

  • _id606b4cfc1601f9443b5d6978 のドキュメントがアップサートされました

以下は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 ドキュメントを参照してください。

  • UpdateOptions.upsert()

  • ReplaceOptions.upsert()

戻る

ドキュメント内の配列の更新