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

ドキュメントの変更

項目一覧

  • Overview
  • Update
  • 更新操作パラメータ
  • 更新 1 つの例
  • 更新の多くの例
  • 置換
  • 操作パラメータの置換
  • 1 つの例を置き換え

このガイドでは、2 つの異なる操作タイプを使用して MongoDB コレクション内のドキュメントを変更する方法を学習できます。

  • Update

  • 置換

更新操作は、1 つ以上のドキュメント内の変更するフィールドと値を指定します。 置換操作では、フィールドと値を指定して、コレクションの 1 つのドキュメントを置き換えます。

次の例では、塗料店で 5 色の塗料を販売しています。 paint_inventoryコレクションは現在の在庫を表します。

{ "_id": 1, "color": "red", "qty": 5 }
{ "_id": 2, "color": "purple", "qty": 8 }
{ "_id": 3, "color": "yellow", "qty": 0 }
{ "_id": 4, "color": "green", "qty": 6 }
{ "_id": 5, "color": "pink", "qty": 0 }

このデータは、次の Kotlin データ クラスでモデル化されます。

data class PaintOrder(
@BsonId val id: Int,
val color: String,
val qty: Int
)

更新操作は、フィールドと値を変更する可能性があります。 アップデート ドキュメントで指定された変更を、クエリフィルターに一致する 1 つ以上のドキュメントに適用します。

updateOne() メソッドはクエリフィルターに一致する最初のドキュメントを変更し、 updateMany() メソッドはクエリフィルターが一致するすべてのドキュメントを変更します。

次のように、 インスタンスで updateOne()メソッドとupdateMany() メソッドを呼び出すことができます。MongoCollection

collection.updateOne(<query>, <updateDocument>)
collection.updateMany(<query>, <updateDocument>)

updateOne()メソッドとupdateMany()メソッドにはどちらも次のパラメータがあります。

  • query コレクション内の更新するドキュメントに一致する条件でクエリフィルターを指定します

  • updateDocument は、一致するドキュメントつまたは複数のドキュメントで変更するフィールドと値を指定します。この例では、 アップデート ビルダー メソッドを使用してアップデートドキュメントを作成します。

  • (任意) updateOptions は、ドライバーが 更新操作を実行する方法をカスタマイズするために設定できるオプションを指定します。このタイプの詳細については、 UpdateOptions のAPIドキュメントを参照してください。

次のように、 Updatesビルダを使用してupdateDocumentを作成できます。

val updateDocument = Updates.operator(<field>, <value>)

Updatesビルダとその使用方法の完全なリストを表示するには、 APIドキュメントの「 更新 」を参照してください。

塗料店は、顧客が黄色の塗料 1 缶を返した後、在庫を更新する必要があります。

塗料の 1 缶を更新するには、次の内容を指定してupdateOne()メソッドを呼び出します。

  • 黄色に一致するクエリフィルター

  • qtyフィールドを1 ずつ増加させるための手順を含む更新ドキュメント

val filter = Filters.eq(PaintOrder::color.name, "yellow")
val update = Updates.inc(PaintOrder::qty.name, 1)
val result = collection.updateOne(filter, update)
println("Matched document count: $result.matchedCount")
println("Modified document count: $result.modifiedCount")
Matched document count: 1
Modified document count: 1

複数のドキュメントが updateOne() メソッドで指定されたクエリフィルターに一致する場合、最初の結果が更新されます。次のコードに示すように、ドライバーが 更新操作 を実行する前に、一致したドキュメントに順序を適用するために、UpdateOptionsインスタンスで並べ替えを指定できます。

val opts = UpdateOptions().sort(Sorts.ascending(PaintOrder::color.name))

その後、塗料店は新しい商品を受け取ったので、在庫を再度更新する必要があります。 入荷には、塗料の各色の 20 缶が含まれています。

在庫をアップデートするには、以下を指定してupdateMany()メソッドを呼び出します。

  • すべての色に一致するクエリフィルター

  • qtyフィールドを20 ずつ増加させるための手順を含む更新ドキュメント

val filter = Filters.empty()
val update = Updates.inc(PaintOrder::qty.name, 20)
val result = collection.updateMany(filter, update)
println("Matched document count: $result.matchedCount")
println("Modified document count: $result.modifiedCount")
Matched document count: 5
Modified document count: 5

以下は、 paint_inventoryコレクション内の更新されたドキュメントを示しています。

{ "_id": 1, "color": "red", "qty": 25 }
{ "_id": 2, "color": "purple", "qty": 28 }
{ "_id": 3, "color": "yellow", "qty": 20 }
{ "_id": 4, "color": "green", "qty": 26 }
{ "_id": 5, "color": "pink", "qty": 20 }

更新操作でクエリフィルターに一致するドキュメントがない場合、updateMany() はコレクション内のドキュメントに変更を加えません。一致するドキュメントがない場合にドキュメントを更新する代わりに新しいドキュメントを挿入する方法については、 アップサート のガイドを参照してください。

重要

updateOne()メソッドとupdateMany()メソッドは、コレクションの一意のインデックス制約に違反するドキュメントを変更できません。 一意なインデックス の詳細については、MongoDB サーバーのマニュアルを参照してください。

置換操作により、コレクションの 1 つのドキュメントが置き換えられます。 置換は、クエリフィルターが一致するドキュメントと置換ドキュメントの間で発生します。

replaceOne() メソッドは、一致するドキュメント内のすべての既存のフィールドと値(_id フィールドを除く)を削除し、それを置換ドキュメントに置き換えます。

次のように、 MongoCollectionインスタンスでreplaceOne()メソッドを呼び出すことができます。

collection.replaceOne(<query>, <replacementDocument>)

replaceOne() メソッドには次のパラメーターがあります。

  • query コレクション内の置き換えドキュメントに一致するための条件でクエリフィルターを指定します

  • replacementDocument 一致したドキュメントで置き換える新しいDocumentオブジェクトのフィールドと値を指定します

  • (任意) replaceOptions は、ドライバーが置換操作を実行する方法をカスタマイズするために設定できるオプションを指定します。このタイプの詳細については、 ReplaceOptions のAPIドキュメントを参照してください。

塗料店では、在庫を再度更新する必要があることが認識されています。 ページ内を表示

在庫をアップデートするには、以下を指定してreplaceOne()メソッドを呼び出します。

  • color が「pink」であるドキュメントに一致するクエリフィルター

  • color が "Orange" で、qty が "25" の置換ドキュメント

val filter = Filters.eq(PaintOrder::color.name, "pink")
val update = PaintOrder(5, "orange", 25)
val result = collection.replaceOne(filter, update)
println("Matched document count: $result.matchedCount")
println("Modified document count: $result.modifiedCount")
Matched document count: 1
Modified document count: 1

以下は更新されたドキュメントを示しています。

{ "_id": 5, "color": "orange", "qty": 25 }

複数のドキュメントが replaceOne() メソッドで指定されたクエリフィルターに一致する場合は、最初の結果が置き換えられます。次のコードに示すように、ドライバーが置換操作を実行する前に、一致したドキュメントに順序を適用するために、ReplaceOptionsインスタンスで並べ替えを指定できます。

val opts = ReplaceOptions().sort(Sorts.ascending(PaintOrder::color.name))

置換操作でクエリフィルターに一致するドキュメントがない場合、replaceOne() はコレクション内のドキュメントに変更を加えません。一致するドキュメントがない場合に、ドキュメントを置き換える代わりに新しいドキュメントを挿入する方法については、 アップサート のガイドを参照してください。

重要

replaceOne()メソッドは、コレクションの一意のインデックス制約に違反するドキュメントを変更することはできません。 一意なインデックス の詳細については、MongoDB サーバーのマニュアルを参照してください。

戻る

Delete Documents