一括操作の実行
bulkWrite()
メソッドは、単一のコレクションに対してバッチ書き込み操作を実行します。 この方法により、アプリケーションから MongoDB インスタンスへのネットワーク ラウンド トリップの回数が削減され、アプリケーションのパフォーマンスが向上します。 すべての操作が返された後にのみ成功ステータスを受け取るため、ユースケースの要件を満たしている場合は、これを使用することをお勧めします。
bulkWrite()
では、次の書き込み操作を 1 つ以上指定できます。
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
bulkWrite()
メソッドは次のパラメーターを受け入れます:
WriteModel
を実装するオブジェクトのList
:WriteModel
を実装するクラスは、前述の書込み操作に対応します。 たとえば、InsertOneModel
クラスはinsertOne
書込み操作をラップします。 各クラスの詳細については、このページの下部にある API ドキュメントへのリンクを参照してください。BulkWriteOptions
: MongoDB インスタンスが書込み操作を順序付けようにするかどうかなどの設定を指定する任意のオブジェクト。
注意
MongoDB Server バージョン 3.6 以降の一括書き込み操作では、 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 インスタンスへの接続の詳細については、「 接続ガイド 」を参照してください。
package usage.examples; import java.util.Arrays; import org.bson.Document; import com.mongodb.MongoException; import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.DeleteOneModel; import com.mongodb.client.model.InsertOneModel; import com.mongodb.client.model.ReplaceOneModel; import com.mongodb.client.model.UpdateOneModel; import com.mongodb.client.model.UpdateOptions; public class BulkWrite { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); try { BulkWriteResult result = collection.bulkWrite( Arrays.asList( new InsertOneModel<>(new Document("name", "A Sample Movie")), new InsertOneModel<>(new Document("name", "Another Sample Movie")), new InsertOneModel<>(new Document("name", "Yet Another Sample Movie")), new UpdateOneModel<>(new Document("name", "A Sample Movie"), new Document("$set", new Document("name", "An Old Sample Movie")), new UpdateOptions().upsert(true)), new DeleteOneModel<>(new Document("name", "Yet Another Sample Movie")), new ReplaceOneModel<>(new Document("name", "Yet Another Sample Movie"), new Document("name", "The Other Sample Movie").append("runtime", "42")) )); System.out.println("Result statistics:" + "\ninserted: " + result.getInsertedCount() + "\nupdated: " + result.getModifiedCount() + "\ndeleted: " + result.getDeletedCount()); } catch (MongoException me) { System.err.println("The bulk write operation failed due to an error: " + me); } } } }
出力は、次のようになります。
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 ドキュメント