一括書き込み操作
項目一覧
Overview
このガイドでは、一括書込み操作を使用して、1 つのデータベース呼び出しで複数の書込み操作を実行する方法を学習できます。
ドキュメントを挿入し、複数の他のドキュメントを更新してから、ドキュメント を削除するシナリオを考えてみましょう。個々のメソッドを使用する場合、各操作には独自のデータベース呼び出しが必要です。
一括書き込み操作 を使用すると、より少ないデータベース呼び出しで複数の書き込み操作を実行できます。次のレベルで一括書き込み操作を実行できます。
コレクション :
MongoCollection.bulkWrite()
メソッドを使用して、単一のコレクションに対して一括書き込み操作を実行できます。このメソッドでは、それぞれの書き込み操作に少なくとも 1 回のデータベース呼び出しが必要です。例、MongoCollection.bulkWrite()
は 1 回の呼び出しで複数のアップデート操作を実行しますが、挿入操作と置換操作の場合はデータベースに 2 回個別の呼び出しを行います。クライアント :アプリケーションがMongoDB Serverバージョン8.0 以降に接続している場合は、
MongoClient.bulkWrite()
メソッドを使用して、同じクラスター内の複数のコレクションとデータベースに対して一括書込み操作を実行できます。このメソッドは、1 回のデータベース呼び出しですべての書き込み操作を実行します。
サンプル データ
このガイドの例では、sample_restaurants.restaurants
Atlasサンプルデータセット の コレクションを使用します。 MongoDB Atlasクラスターを無料で作成し、サンプルデータセットをロードする方法については、「 を使い始める 」チュートリアルを参照してください。
重要
プロジェクトリ アクター ライブラリ
このガイドでは、プロジェクト Reactive ライブラリを使用して、Publisher
Java Reactive Streams ドライバー メソッドによって返された インスタンスを消費します。プロジェクト Reactor ライブラリとその使用方法の詳細については、React ドキュメントの「 使用開始 」 を参照してください。このガイドでは Project React ライブラリ メソッドをどのように使用しているかについて詳しくは、「 MongoDBへのデータの書込み 」ガイドを参照してください。
コレクションの一括書込み (write)
一括書き込み操作には、1 つ以上の書き込み操作が含まれます。コレクションレベルで一括書き込み操作を実行するには、WriteModel
ドキュメントの List
を MongoCollection.bulkWrite()
メソッドに渡します。 WriteModel
は 書込み操作を表すモデルです。
実行する書込み操作ごとに、WriteModel
から継承する次のいずれかのクラスのインスタンスを作成します。
InsertOneModel
UpdateOneModel
UpdateManyModel
ReplaceOneModel
DeleteOneModel
DeleteManyModel
次のセクションでは、前述のクラスのインスタンスを作成して使用する方法を示します。
挿入操作
挿入操作を実行するには、 InsertOneModel
のインスタンスを作成し、挿入するドキュメントを渡します。
次の例では、 InsertOneModel
のインスタンスを作成しています。
InsertOneModel<Document> operation = new InsertOneModel<>( new Document("name", "Mongo's Deli") .append("cuisine", "Sandwiches"));
複数のドキュメントを挿入するには、ドキュメントごとにInsertOneModel
のインスタンスを作成します。
アップデート操作
ドキュメントを更新するには、 UpdateOneModel
のインスタンスを作成し、次の引数を渡します。
コレクション内のドキュメントをマッチングするために使用される基準を指定するクエリフィルター。
実行する更新操作。 更新操作の詳細については、 MongoDB Serverマニュアルの「フィールド更新演算子」ガイドを参照してください。
次の例では、 UpdateOneModel
のインスタンスを作成しています。
UpdateOneModel<Document> operation = new UpdateOneModel<>( eq("name", "Mongo's Deli"), set("cuisine", "Sandwiches and Salads"));
複数のドキュメントが UpdateOneModel
インスタンスで指定されたクエリフィルターに一致する場合、この操作最初の結果が更新されます。次のコードに示すように、ドライバーが 更新操作 を実行する前に、一致したドキュメントに順序を適用するために、UpdateOptions
インスタンスで並べ替えを指定できます。
UpdateOptions options = UpdateOptions.sort(Sorts.ascending("_id"));
複数のドキュメントを更新するには、 UpdateManyModel
のインスタンスを作成し、同じ引数で渡します。 UpdateManyModel
は、クエリフィルターに一致するすべてのドキュメントを更新します。
次の例では、 UpdateManyModel
のインスタンスを作成しています。
UpdateManyModel<Document> operation = new UpdateManyModel<>( eq("name", "Mongo's Deli"), set("cuisine", "Sandwiches and Salads"));
置換操作
置換操作すると、 _id
フィールド以外の、指定されたドキュメントのすべてのフィールドと値が削除され、新しいフィールドと値に置き換えられます。 置換操作を実行するには、 ReplaceOneModel
のインスタンスを作成し、クエリフィルターと、一致するドキュメントに保存するフィールドと値を渡します。
次の例では、 ReplaceOneModel
のインスタンスを作成しています。
ReplaceOneModel<Document> operation = new ReplaceOneModel<>( eq("name", "Original Pizza"), new Document("name", "Mongo's Pizza") .append("borough", "Manhattan"));
複数のドキュメントが ReplaceOneModel
インスタンスで指定されたクエリフィルターに一致する場合、その操作は最初の結果を置き換えます。次のコードに示すように、ドライバーが置換操作を実行する前に、一致したドキュメントに順序を適用するために、ReplaceOptions
インスタンスで並べ替えを指定できます。
ReplaceOptions options = ReplaceOptions.sort(Sorts.ascending("_id"));
Tip
複数のドキュメントの置換
複数のドキュメントを置き換えるには、ドキュメントごとにReplaceOneModel
のインスタンスを作成します。
削除操作
ドキュメントを削除するには、 DeleteOneModel
のインスタンスを作成し、削除するドキュメントを指定するクエリフィルターを渡します。 DeleteOneModel
は、クエリフィルターに一致する最初のドキュメントのみを削除します。
次の例では、 DeleteOneModel
のインスタンスを作成しています。
DeleteOneModel<Document> operation = new DeleteOneModel<>( eq("restaurant_id", "5678"));
複数のドキュメントを削除するには、 DeleteManyModel
のインスタンスを作成し、削除するドキュメントを指定するクエリフィルターを渡します。 DeleteManyModel
は、クエリフィルターに一致するすべてのドキュメントを削除します。
次の例では、 DeleteManyModel
のインスタンスを作成しています。
DeleteManyModel<Document> operation = new DeleteManyModel<>( eq("name", "Mongo's Deli"));
一括操作の実行
実行する操作ごとに WriteModel
インスタンスを定義した後、これらのインスタンスのリストを bulkWrite()
メソッドに渡します。デフォルトでは 、メソッドはリストで定義された順序で操作を実行します。
次の例では、 bulkWrite()
メソッドを使用して複数の書込み操作を実行します。
Publisher<BulkWriteResult> bulkWritePublisher = restaurants.bulkWrite( Arrays.asList(new InsertOneModel<>( new Document("name", "Mongo's Deli") .append("cuisine", "Sandwiches") .append("borough", "Manhattan") .append("restaurant_id", "1234")), new InsertOneModel<>(new Document("name", "Mongo's Deli") .append("cuisine", "Sandwiches") .append("borough", "Brooklyn") .append("restaurant_id", "5678")), new UpdateManyModel<>(eq("name", "Mongo's Deli"), set("cuisine", "Sandwiches and Salads")), new DeleteOneModel<>(eq("restaurant_id", "1234")))); BulkWriteResult bulkResult = Mono.from(bulkWritePublisher).block(); System.out.println(bulkResult.toString());
AcknowledgedBulkWriteResult{insertedCount=2, matchedCount=2, removedCount=1, modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0, id=BsonObjectId{value=66a7e0a6c08025218b657208}}, BulkWriteInsert{index=1, id=BsonObjectId{value=66a7e0a6c08025218b657209}}]}
いずれかの書込み操作が失敗した場合、 Java Reactive Streams ドライバーはMongoBulkWriteException
をシグナルし、それ以上の個々の操作を実行しません。 MongoBulkWriteException
にはMongoBulkWriteException.getWriteErrors()
メソッドを使用してアクセスできるBulkWriteError
が含まれており、個々の障害の詳細が提供されます。
注意
Java Reactive Streams ドライバーが 一括操作を実行する場合、操作が実行中されているコレクションのwriteConcern
を使用します。 ドライバーは、実行順序に関係なく、すべての操作を試行した後にすべての書込み保証 ( 書込み保証 (write concern) ) エラーを報告します。
一括書き込みをカスタマイズする
BulkWriteOptions
クラスには、 bulkWrite()
メソッドの動作を変更するメソッドが含まれています。 BulkWriteOptions
クラスを使用するには、クラスの新しいインスタンスを作成し、そのメソッドの 1 つ以上を呼び出して 書込み操作を変更します。 これらのメソッド呼び出しを連鎖させることができます。 書込み操作の動作を変更するには、クラスインスタンスをbulkWrite()
メソッドの最後の引数として渡します。
書き込みメソッドを変更するには、 BulkWriteOptions
クラスの次のメソッドを使用します。 すべてのメソッドは任意です。
方式 | 説明 |
---|---|
| Specifies whether the bulk write operation bypasses document validation. This lets you
perform write operations on documents that don't meet the schema validation requirements, if any
exist. For more information about schema validation, see Schema
Validation in the MongoDB
Server manual. |
| Attaches a Bson comment to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
| Attaches a String comment to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
| Specifies a map of parameter names and values. Values must be constant or closed
expressions that don't reference document fields. For more information,
see the let statement in the
MongoDB Server manual. |
| If set to True , the driver performs the individual operations in the order
provided. If an individual operation fails, the driver will not execute any
subsequent individual operations.Defaults to True . |
次の例では、前の例からbulkWrite()
メソッドを呼び出しますが、 ordered
オプションをFalse
に設定します。
Publisher<BulkWriteResult> bulkWritePublisher = restaurants.bulkWrite( Arrays.asList(new InsertOneModel<>( new Document("name", "Mongo's Deli") .append("cuisine", "Sandwiches") .append("borough", "Manhattan") .append("restaurant_id", "1234")), new InsertOneModel<>(new Document("name", "Mongo's Deli") .append("cuisine", "Sandwiches") .append("borough", "Brooklyn") .append("restaurant_id", "5678")), new UpdateManyModel<>(eq("name", "Mongo's Deli"), set("cuisine", "Sandwiches and Salads")), new DeleteOneModel<>(eq("restaurant_id", "1234"))), new BulkWriteOptions().ordered(false)); BulkWriteResult bulkResult = Mono.from(bulkWritePublisher).block(); System.out.println(bulkResult.toString());
AcknowledgedBulkWriteResult{insertedCount=2, matchedCount=2, removedCount=1, modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0, id=BsonObjectId{value=66a7e03cce430c5854b6caf9}}, BulkWriteInsert{index=1, id=BsonObjectId{value=66a7e03cce430c5854b6cafa}}]}
順序付けなし一括書き込み 内のいずれかの書込み操作が失敗した場合、 Java Reactive Streams ドライバーはすべての操作を試行した後にのみエラーを報告します。
注意
順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
クライアント一括書込み (write)
MongoDB Server 8.0 以降を実行中配置に接続する場合、MongoClient.bulkWrite()
メソッドを使用して同じクラスター内の複数のデータベースとコレクションに書込み (write) できます。 MongoClient.bulkWrite()
メソッドは、1 回の呼び出しですべての書き込み操作を実行します。
MongoClient.bulkWrite()
メソッドは、さまざまな書込み操作を表すために ClientNamespacedWriteModel
インスタンスのリストを受け取ります。インスタンスメソッドを使用して、ClientNamespacedWriteModel
インターフェースのインスタンスを構築できます。例、ClientNamespacedInsertOneModel
のインスタンスは1 つのドキュメントを挿入する操作を表します。このモデルは ClientNamespacedWriteModel.insertOne()
メソッドを使用して作成できます。
モデルとそれに対応するインスタンスメソッドは、以下の表に説明されています。
モデル | インスタンス メソッド | 説明 | パラメーター |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次のセクションでは、モデルを作成し、クライアントのbulkWrite()
メソッドを使用する方法の例をいくつか示します。
挿入操作
この例では、 2 つのドキュメントを挿入する指示を含むモデルを作成する方法を示しています。 1 つのドキュメントはdb.people
コレクションに挿入され、もう 1 つのドキュメントはdb.things
コレクションに挿入されます。 MongoNamespace
インスタンスは、各書込み操作が適用されるターゲットデータベースとコレクションを定義します。
ClientNamespacedInsertOneModel personToInsert = ClientNamespacedWriteModel .insertOne( new MongoNamespace("db", "people"), new Document("name", "Julia Smith") ); ClientNamespacedInsertOneModel thingToInsert = ClientNamespacedWriteModel .insertOne( new MongoNamespace("db", "things"), new Document("object", "washing machine") );
置換操作
次の例は、 db.people
コレクションと db.things
コレクション内の既存のドキュメントを置き換えるためのモデルを作成する方法を示しています。
ClientNamespacedReplaceOneModel personReplacement = ClientNamespacedWriteModel .replaceOne( new MongoNamespace("db", "people"), Filters.eq("_id", 1), new Document("name", "Frederic Hilbert") ); ClientNamespacedReplaceOneModel thingReplacement = ClientNamespacedWriteModel .replaceOne( new MongoNamespace("db", "things"), Filters.eq("_id", 1), new Document("object", "potato") );
この例が正常に実行されると、people
コレクション内の _id
値が 1
であるドキュメントは、新しいドキュメントに置き換えられます。 _id
値が 1
である things
コレクション内のドキュメントは、 新しいドキュメントに置き換えられます。
一括操作の実行
実行する操作ごとに ClientNamespacedWriteModel
インスタンスを定義した後、これらのインスタンスのリストをクライアントの bulkWrite()
メソッドに渡します。デフォルトでは 、メソッドは指定された順序で操作を実行します。
次の例では、 bulkWrite()
メソッドを使用して複数の書込み操作を実行します。
MongoNamespace peopleNamespace = new MongoNamespace("db", "people"); MongoNamespace thingsNamespace = new MongoNamespace("db", "things"); List<ClientNamespacedWriteModel> bulkOperations = Arrays.asList( ClientNamespacedWriteModel .insertOne( peopleNamespace, new Document("name", "Corey Kopper") ), ClientNamespacedWriteModel .replaceOne( thingsNamespace, Filters.eq("_id", 1), new Document("object", "potato") ) ); Publisher<ClientBulkWriteResult> bulkWritePublisher = mongoClient .bulkWrite(bulkOperations); ClientBulkWriteResult clientBulkResult = Mono .from(bulkWritePublisher) .block(); System.out.println(clientBulkResult.toString());
AcknowledgedSummaryClientBulkWriteResult{insertedCount=1, matchedCount=1, ...}
書き込み操作のいずれかが失敗した場合、ドライバーは ClientBulkWriteException
を発生させ、それ以上の個々の操作を実行しません。 ClientBulkWriteException
には ClientBulkWriteException.getWriteErrors()
メソッドを使用してアクセスできる BulkWriteError
が含まれており、個々の障害の詳細が提供されます。
一括書き込みをカスタマイズする
ClientBulkWriteOptions
のインスタンスをbulkWrite()
メソッドに渡して、ドライバーが 一括書込み操作を実行する方法をカスタマイズできます。
実行順序
デフォルトでは 、ドライバーは、エラーが発生するまで、または操作が正常に完了するまで、指定された順序で個々の操作を一括操作で実行します。
ただし、ClientBulkWriteOptions
インスタンスを作成するときに false
を ordered()
メソッドに渡して、ドライバーに書込み操作を順序なしで実行させることができます。順序付けなし オプションを使用する場合、エラーが発生しても操作はドライバーが 一括書込み操作で他の書込み操作を実行中ことを妨げるものではありません。
次のコードは、ClientBulkWriteOptions
のインスタンスで ordered
オプションを false
に設定し、一括書き込み操作を実行して複数のドキュメントを挿入します。
MongoNamespace namespace = new MongoNamespace("db", "people"); ClientBulkWriteOptions options = ClientBulkWriteOptions .clientBulkWriteOptions() .ordered(false); List<ClientNamespacedWriteModel> bulkOperations = Arrays.asList( ClientNamespacedWriteModel.insertOne( namespace, new Document("_id", 1).append("name", "Rudra Suraj") ), // Causes a duplicate key error ClientNamespacedWriteModel.insertOne( namespace, new Document("_id", 1).append("name", "Mario Bianchi") ), ClientNamespacedWriteModel.insertOne( namespace, new Document("name", "Wendy Zhang") ) ); Publisher<ClientBulkWriteResult> bulkWritePublisher = mongoClient .bulkWrite(bulkOperations, options);
重複キーを持つドキュメントを挿入する書込み操作ではエラーが発生しますが、書込み操作は順序付けがないため、他の操作が実行されます。
詳細情報
個々の書込み操作を実行する方法については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。