bulkWrite()メソッドは、単一のコレクションに対してバッチ書き込み操作を実行します。 この方法により、アプリケーションから MongoDB インスタンスへのネットワーク ラウンド トリップの回数が削減され、アプリケーションのパフォーマンスが向上します。 すべての操作が返された後にのみ成功ステータスを受け取るため、ユースケースの要件を満たしている場合は、これを使用することをお勧めします。
bulkWrite() では、次の書き込み操作を 1 つ以上指定できます。
insertOneupdateOneupdateManydeleteOnedeleteManyreplaceOne
bulkWrite() メソッドは次のパラメーターを受け入れます:
WriteModelを実装するオブジェクトのList:WriteModelを実装するクラスは、前述の書込み操作に対応します。 たとえば、InsertOneModelクラスはinsertOne書込み操作をラップします。 各クラスの詳細については、このページの下部にある API ドキュメントへのリンクを参照してください。BulkWriteOptions: MongoDB インスタンスが書込み操作を順序付けようにするかどうかなどの設定を指定する任意のオブジェクト。
注意
再試行可能な書き込みは、UpdateManyModel または DeleteManyModel の 1 つ以上のインスタンスを含まない場合は、一括書き込み操作で実行されます。
Tip
デフォルトでは、MongoDB は指定された順序で一括書込み操作を 1 つずつ実行します(つまり、 シリアルに)する必要があります。 順序付き一括書込み中に、操作の処理中にエラーが発生した場合、MongoDB はリスト内の残りの操作を処理せずに返します。 対照的に、 orderedをfalseに設定すると、エラーが発生した場合、MongoDB はリスト内の残りの書込み操作の処理を続行します。 MongoDB では順序なし操作が並列に実行できるため、論理的には高速ですが、書込みが順序に依存しない場合にのみ使用してください。
bulkWrite()メソッドは、挿入、変更、削除されたドキュメントの数など、書込み(write)操作の結果に関する情報を含むBulkWriteResultオブジェクトを返します。
1 つ以上の操作でコレクションの一意なインデックスに違反する値を設定しようとすると、次のようになります例外が発生します。
The bulk write operation failed due to an error: Bulk write operation error on server <hostname>. Write errors: [BulkWriteError{index=0, code=11000, message='E11000 duplicate key error collection: ... }].
同様に、スキーマ検証を使用し、1 つ以上の書込み操作が予期しない形式を提供するコレクションに対して一括書込みを実行しようとすると、例外が発生する可能性があります。
例
次のコード サンプルでは、 sample_mflixデータベースのmoviesコレクションに対して順序付き一括書き込み操作を実行します。 bulkWrite()の呼び出し例には、 InsertOneModel 、 UpdateOneModel 、 DeleteOneModelの例が含まれています。
注意
この例では、接続 URI を使用してMongoDBのインスタンスに接続します。MongoDBインスタンスへの接続の詳細については、 接続ガイドを参照してください。
import com.mongodb.MongoException import com.mongodb.client.model.DeleteOneModel import com.mongodb.client.model.Filters import com.mongodb.client.model.InsertOneModel import com.mongodb.client.model.ReplaceOneModel import com.mongodb.client.model.UpdateOneModel import com.mongodb.client.model.UpdateOptions import com.mongodb.client.model.Updates import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking data class Movie(val title: String, val runtime: Int? = null) fun main() = runBlocking { // Replace the uri string with your MongoDB deployment's connection string val uri = "<connection string uri>" val mongoClient = MongoClient.create(uri) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Movie>("movies") try { val result = collection.bulkWrite( listOf( InsertOneModel(Movie("A Sample Movie")), InsertOneModel(Movie("Another Sample Movie")), InsertOneModel(Movie("Yet Another Sample Movie")), UpdateOneModel( Filters.eq(Movie::title.name,"A Sample Movie"), Updates.set(Movie::title.name, "An Old Sample Movie"), UpdateOptions().upsert(true) ), DeleteOneModel(Filters.eq("title", "Another Sample Movie")), ReplaceOneModel( Filters.eq(Movie::title.name, "Yet Another Sample Movie"), Movie("The Other Sample Movie", 42) ) ) ) println( """ Result statistics: inserted: ${result.insertedCount} updated: ${result.modifiedCount} deleted: ${result.deletedCount} """.trimIndent() ) } catch (e: MongoException) { System.err.println("The bulk write operation failed due to an error: $e") } mongoClient.close() }
Result statistics: inserted: 3 updated: 2 deleted: 1
このページで言及されているクラスとメソッドについての追加情報については、次のリソースを参照してください。
一意のインデックスサーバーのマニュアルエントリ
スキーマ検証サーバーの手動入力
bulkWrite() APIドキュメント
BulkWriteOptions APIドキュメント
BulkWriteResult APIドキュメント
InsertOneModel APIドキュメント
UpdateOneModel API Documentation
UpdateManyModel APIドキュメント
DeleteOneModel APIドキュメント
DeleteManyModel APIドキュメント
ReplaceOneModel APIドキュメント