ドキュメントの変更
Overview
このガイドでは、2 つの異なる操作タイプを使用して MongoDB コレクション内のドキュメントを変更する方法を学習できます。
更新操作は、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( val id: Int, val color: String, val qty: Int )
Update
更新操作は、フィールドと値を変更する可能性があります。 アップデート ドキュメントで指定された変更を、クエリフィルターに一致する 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 缶を返した後、在庫を更新する必要があります。
塗料の 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ドキュメントを参照してください。
1 つの例を置き換え
塗料店では、在庫を再度更新する必要があることが認識されています。 ページ内を表示
在庫をアップデートするには、以下を指定して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 サーバーのマニュアルを参照してください。