Overview
このガイドでは、MongoDB Kotlin ドライバーで一括操作を使用する方法を学習できます。
個々の CRUD 操作には、関連する メソッドを使用できます。 たとえば、1 つのドキュメントを挿入して複数のドキュメントを更新するには、 insertOne()メソッドとupdateMany()メソッドを使用できます。
MongoClientは、各操作に対応するデータベースにリクエストを送信し、これらの操作を実行します。 一括操作を使用することで、データベースへの呼び出し回数を減らすことができます。
一括操作の実行
一括操作は、多数の書込み (write) 操作で構成されています。 一括操作を実行するには、 WriteModel ListをbulkWrite()メソッドに渡します。 WriteModelは、単一の書込み操作を表すモデルです。
次のセクションでは、 WriteModel型の各バリエーションの作成方法と使用方法を示します。 各セクションの例では、 peopleコレクション内の次のドキュメントを使用します。
{ "_id": 1, "name": "Karen Sandoval", "age": 31 } { "_id": 2, "name": "William Chin", "age": 54 } { "_id": 8, "name": "Shayla Ray", "age": 20 }
このデータは、次の Kotlin データ クラスでモデル化されます。
data class Person( val id: Int, val name: String, val age: Int? = null, val location: String? = null )
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
挿入操作
挿入操作を実行するには、挿入するドキュメントを指定するInsertOneModelを作成します。 複数のドキュメントを挿入するには、挿入するドキュメントごとにInsertOneModelを作成する必要があります。
例
次の例では、人物を説明する 2 つのドキュメントに対してInsertOneModelを作成しています。
val juneDoc = InsertOneModel(Person(3, "June Carrie", 17)) val kevinDoc = InsertOneModel(Person(4, "Kevin Moss", 22))
重要
bulkWrite()操作を実行する場合、 InsertOneModelはコレクション内にすでに存在する_idを含むドキュメントを挿入できません。 この場合ドライバーはMongoBulkWriteExceptionをスローします。
次の例では、 _idの値が1と3である 2 つのドキュメントを挿入しようとしています。 コレクションには_idが1であるドキュメントがすでにあるため、操作はエラーになります。
try { val bulkOperations = listOf( (InsertOneModel(Person(1, "James Smith", 13))), (InsertOneModel(Person(3, "Colin Samuels"))) ) val bulkWrite = collection.bulkWrite(bulkOperations) } catch (e: MongoBulkWriteException) { println("A MongoBulkWriteException occurred with the following message: " + e.message) }
A MongoBulkWriteException occurred with the following message: Bulk write operation error on server sample-shard-00-02.pw0q4.mongodb.net:27017. Write errors: [BulkWriteError{index=0, code=11000, message='E11000 duplicate key error collection: crudOps.bulkWrite index: _id_ dup key: { _id: 1 }', details={}}].
ドライバーが3の_idを含むドキュメントを挿入しなかった理由については、「実行順序 」セクションを参照してください。
このセクションで説明されるメソッドとクラスの詳細については、 InsertOneModel APIドキュメント を参照してください。
置換操作
置換操作を実行するには、置換するドキュメントと置換ドキュメントのクエリフィルターを指定するReplaceOneModelを作成します。
重要
bulkWrite()を実行する場合、 ReplaceOneModelはコレクションの一意のインデックス制約に違反する変更を行うことはできません。 さらに、クエリフィルターに一致するものがない場合、モデルは置換操作を実行しません。
例
次の例では、 ReplaceOneModelを作成して、 _idが1であるドキュメントを、追加のlocationフィールドを含むドキュメントに置き換えます。
val filter = Filters.eq("_id", 1) val insert = Person(1, "Celine Stork", location = "San Diego, CA") val doc = ReplaceOneModel(filter, insert)
このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。
ReplaceOneModel APIドキュメント
一意なインデックスサーバー マニュアルの説明
アップデート操作
アップデート操作を実行するには、クエリフィルターとアップデート ドキュメントを指定するUpdateOneModelまたはUpdateManyModelを作成します。
UpdateOneModelはクエリフィルターに一致する最初のドキュメントを更新し、 UpdateManyModelはクエリフィルターに一致するすべてのドキュメントを更新します。
重要
bulkWrite()を実行する場合、 UpdateOneModel型とUpdateManyModel型はコレクションの一意のインデックス制約に違反する変更を行うことはできません。 さらに、クエリフィルターに一致するものがない場合、モデルは更新操作を実行しません。
例
次の例では、 _idが2であるドキュメントでageフィールドを1ずつ増加させるためのUpdateOneModelを作成します。
val filter = Filters.eq("_id", 2) val update = Updates.inc(Person::age.name, 1) val doc = UpdateOneModel<Person>(filter, update)
このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。
UpdateOneModel API Documentation
UpdateManyModel APIドキュメント
一意なインデックスサーバー マニュアルの説明
削除操作
削除操作を実行するには、削除するドキュメントのクエリフィルターを指定するDeleteOneModelまたはDeleteManyModelを作成します。
DeleteOneModelはクエリフィルターに一致する最初のドキュメントを削除し、 DeleteManyModelはクエリフィルターに一致するすべてのドキュメントを削除します。
重要
bulkWrite()の実行時に、クエリフィルターに一致しない場合、 DeleteOneModelおよびDeleteManyModelタイプはドキュメントを削除しません。
例
次の例では、 _idが1であるドキュメントを削除するためのDeleteOneModelと、 ageの値が30より小さいドキュメントを削除するためのDeleteManyModelを作成します。
val deleteId1 = DeleteOneModel<Person>(Filters.eq("_id", 1)) val deleteAgeLt30 = DeleteManyModel<Person>(Filters.lt(Person::age.name, 30))
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
実行順序
bulkWrite()メソッドでは、一括操作を順序付きで実行するか、順序なしで実行するかを指定する 2 番目のパラメーターとして任意のBulkWriteOptionsを受け入れます。
順序付き実行
デフォルトでは、 bulkWrite()メソッドは一括操作を順番に実行します。 つまり、エラーが発生するまで、操作はリストに追加した順序で実行されます。
例
次の例では、これらの一括操作を実行します。
nameが"Zaynab Omar"で、ageが37であるドキュメントの挿入操作_idが1であるドキュメントを、locationフィールドを含む新しいドキュメントに置き換え操作_idが6であるドキュメントの更新操作でnameフィールドを変更ageの値が50より大きいすべてのドキュメントの削除操作
val insertMdl = InsertOneModel(Person(6, "Zaynab Omar", 37)) val replaceMdl = ReplaceOneModel( Filters.eq("_id", 1), Person(1, "Sandy Kane", location = "Helena, MT") ) val updateMdl = UpdateOneModel<Person>( Filters.eq("_id", 6), Updates.set(Person::name.name, "Zaynab Hassan") ) val deleteMdl = DeleteManyModel<Person>(Filters.gt(Person::age.name, 50)) val bulkOperations = listOf( insertMdl, replaceMdl, updateMdl, deleteMdl ) val result = collection.bulkWrite(bulkOperations)
この例の実行後、コレクションには次のドキュメントが含まれます。
{ "_id": 1, "name": "Sandy Kane", "location": "Helena, MT" } { "_id": 8, "name": "Shayla Ray", "age": 20 } { "_id": 6, "name": "Zaynab Hassan", "age": 37 }
順序なし実行
また、 BulkWriteOptionsオブジェクトのordered()メソッドにfalseを渡すことで、任意の順序で一括操作を実行することもできます。 This means that all the write operations execute regardless of errors. エラーが発生した場合、ドライバーは最後にそれを報告します。
次のコードは、実行順序なしの一括操作を実行する方法を示しています。
val options = BulkWriteOptions().ordered(false) val unorderedResult = collection.bulkWrite(bulkOperations, options)
注意
順序なしの一括操作では、実行順序は保証されません。 ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
前の例では、 bulkWrite()メソッドがアップデート操作の後に挿入操作を実行した場合、その時点でドキュメントは存在していないため、アップデート操作によって変更は生成されません。 コレクションには、次のドキュメントが含まれます。
{ "_id": 1, "name": "Sandy Kane", "location": "Helena, MT" } { "_id": 8, "name": "Shayla Ray", "age": 20 } { "_id": 6, "name": "Zaynab Omar", "age": 37 }
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
概要
一括操作を実行するには、作成してWriteModelドキュメントのリストをbulkWrite()メソッドに渡します。
WriteModelには 6 つのバリエーションがあります。
InsertOneModelReplaceOneModelUpdateOneModelUpdateManyModelDeleteOneModelDeleteManyModel
bulkWrite()メソッドを実行するには次の 2 つの方法があります。
順序付き。エラーが発生するまで、ドライバーは書込み操作を順番に実行します。
順序付けなし: ドライバーがすべての書込み (write) 操作を任意の順序で実行し、操作の完了後にエラーを報告します。