一括操作
項目一覧
Overview
このガイドでは、 Javaドライバーで一括操作を使用する方法を学習できます。
単一の 作成、置換、アップデート、または削除操作を実行するには、対応するメソッドを使用できます。例、1 つのドキュメントを挿入し、1 つのドキュメントを置き換えるには、insertOne()
メソッドと replaceOne()
メソッドを使用できます。これらのメソッドを使用すると、クライアントは操作ごとにデータベースを 1 回呼び出します。
一括書き込み操作 を使用すると、より少ないデータベース呼び出しで複数の書き込み操作を実行できます。次のレベルで一括書き込み操作を実行できます。
コレクション :
MongoCollection.bulkWrite()
メソッドを使用して、単一のコレクションに対して一括書き込み操作を実行できます。このメソッドでは、それぞれの書き込み操作に少なくとも 1 回のデータベース呼び出しが必要です。例、MongoCollection.bulkWrite()
は 1 回の呼び出しで複数のアップデート操作を実行しますが、挿入操作と置換操作の場合はデータベースに 2 回個別の呼び出しを行います。クライアント :アプリケーションがMongoDB Serverバージョン8.0 以降に接続している場合は、
MongoClient.bulkWrite()
メソッドを使用して、同じクラスター内の複数のコレクションとデータベースに対して一括書込み操作を実行できます。このメソッドは、1 回のデータベース呼び出しですべての書き込み操作を実行します。
コレクションの一括書込み (write)
一括書き込み操作には、1 つ以上の書き込み操作が含まれます。コレクションレベルで一括書き込み操作を実行するには、WriteModel
ドキュメントの List
を MongoCollection.bulkWrite()
メソッドに渡します。 WriteModel
は 書込み操作を表すモデルです。
MongoCollection.bulkWrite()
メソッドは、個別のデータベース呼び出しでそれぞれの種類の書込み操作を実行します。例、DeleteOneModel
、DeleteManyModel
、ReplaceOneModel
オブジェクトを メソッドに渡すと、削除操作の呼び出しと置換操作の 2 回の呼び出しが実行されます。
注意
次のセクションでは、各WriteModel
ドキュメントの作成方法と使用方法を示します。 各セクションの例では、 people
コレクション内の次のドキュメントを使用します。
{ "_id": 1, "name": "Karen Sandoval", "age": 31 } { "_id": 2, "name": "William Chin", "age": 54 } { "_id": 8, "name": "Shayla Ray", "age": 20 }
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
挿入操作
挿入操作を実行するには、挿入するドキュメントを指定するInsertOneModel
を作成します。 複数のドキュメントを挿入するには、挿入するドキュメントごとにInsertOneModel
を作成する必要があります。
例
次の例では、人物を説明する 2 つのドキュメントに対してInsertOneModel
を作成しています。
InsertOneModel<Document> juneDoc = new InsertOneModel<>(new Document("name", "June Carrie") .append("age", 17)); InsertOneModel<Document> kevinDoc = new InsertOneModel<>(new Document("name", "Kevin Moss") .append("age", 22));
重要
bulkWrite()
を実行する場合、 InsertOneModel
はコレクション内にすでに存在する_id
を含むドキュメントを挿入できません。 代わりに、メソッドはMongoBulkWriteException
をスローします。
次の例では、 _id
が1
と3
である 2 つのドキュメントを挿入しようとしています。
try { List<WriteModel<Document>> bulkOperations = new ArrayList<>(); // Creates instructions to insert documents InsertOneModel<Document> doc1 = new InsertOneModel<>(new Document("_id", 1)); InsertOneModel<Document> doc3 = new InsertOneModel<>(new Document("_id", 3)); bulkOperations.add(doc1); bulkOperations.add(doc3); // Runs a bulk write operation for the specified insert WriteModels collection.bulkWrite(bulkOperations); // Prints a message if any exceptions occur during the bulk write operation } catch (MongoBulkWriteException e){ System.out.println("A MongoBulkWriteException occurred with the following message: " + e.getMessage()); }
次に、前のコードの出力を示します。
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
フィールドが追加されたドキュメントに置き換えます。
ReplaceOneModel<Document> celineDoc = new ReplaceOneModel<>( Filters.eq("_id", 1), new Document("name", "Celine Stork") .append("location", "San Diego, CA"));
複数のドキュメントが ReplaceOneModel
インスタンスで指定されたクエリフィルターに一致する場合、その操作は最初の結果を置き換えます。次のコードに示すように、ドライバーが置換操作を実行する前に、一致したドキュメントに順序を適用するために、ReplaceOptions
インスタンスで並べ替えを指定できます。
ReplaceOptions options = ReplaceOptions.sort(Sorts.ascending("_id"));
このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。
ReplaceOneModel APIドキュメント
ReplaceOptions APIドキュメント
一意なインデックスサーバー マニュアルの説明
アップデート操作
アップデート操作を実行するには、アップデート内容を使用してアップデートするドキュメントのクエリフィルターを指定するUpdateOneModel
またはUpdateManyModel
を作成します。
UpdateOneModel
はクエリフィルターに一致する最初のドキュメントを更新し、 UpdateManyModel
はクエリフィルターに一致するすべてのドキュメントを更新します。
重要
bulkWrite()
を実行する場合、 UpdateOneModel
とUpdateManyModel
はコレクションの一意のインデックス制約に違反するドキュメントを変更できません。クエリフィルターに一致しない場合、モデルはドキュメントを更新しません。
例
次の例では、 _id
が2
であるドキュメントのage
フィールドを更新するためのUpdateOneModel
を作成します。
UpdateOneModel<Document> updateDoc = new UpdateOneModel<>( Filters.eq("_id", 2), Updates.set("age", 31));
複数のドキュメントが UpdateOneModel
インスタンスで指定されたクエリフィルターに一致する場合、この操作最初の結果が更新されます。次のコードに示すように、ドライバーが 更新操作 を実行する前に、一致したドキュメントに順序を適用するために、UpdateOptions
インスタンスで並べ替えを指定できます。
UpdateOptions options = UpdateOptions.sort(Sorts.ascending("_id"));
このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。
UpdateOneModel API documentation
UpdateManyModel APIドキュメント
UpdateOptions API documentation
一意なインデックスサーバー マニュアルの説明
削除操作
削除操作を実行するには、削除するドキュメントのクエリフィルターを指定するDeleteOneModel
またはDeleteManyModel
を作成します。
DeleteOneModel
はクエリフィルターに一致する最初のドキュメントを削除し、 DeleteManyModel
はクエリフィルターに一致するすべてのドキュメントを削除します。
重要
bulkWrite()
を実行するとき、クエリフィルターに一致しない場合、 DeleteOneModel
とDeleteManyModel
はドキュメントを削除しません。
例
次の例では、 _id
が1
であるドキュメントを削除するためにDeleteOneModel
を作成しています。
DeleteOneModel<Document> deleteDoc = new DeleteOneModel<>(Filters.eq("_id", 1));
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
実行順序
bulkWrite()
メソッドでは、一括操作の実行が順序付きか順序なしかを指定する 2 番目のパラメータとして任意のBulkWriteOptions
を受け入れます。
順序付き実行
デフォルトでは、 bulkWrite()
メソッドは一括操作を順番に実行します。 つまり、エラーが発生するまで、一括操作はリストに追加した順序で実行されます(存在する場合)。
例
次の例では、これらの一括操作を実行します。
:
"Zaynab Omar"
のname
値と37
のage
値を持つドキュメントを挿入する操作_id
が1
であるドキュメントを、location
フィールドを含む新しいドキュメントに置き換える操作ドキュメントを
"Zaynab Omar"
のname
値で更新し、name
を"Zaynab Hassan"
に変更する操作age
の値が50
より大きいすべてのドキュメントを削除する操作
List<WriteModel<Document>> bulkOperations = new ArrayList<>(); // Creates instructions to insert a document InsertOneModel<Document> insertDoc = new InsertOneModel<>(new Document("_id", 6) .append("name", "Zaynab Omar") .append("age", 37)); // Creates instructions to replace the first document matched by the query ReplaceOneModel<Document> replaceDoc = new ReplaceOneModel<>(Filters.eq("_id", 1), new Document("name", "Sandy Kane") .append("location", "Helena, MT")); // Creates instructions to update the first document matched by the query UpdateOneModel<Document> updateDoc = new UpdateOneModel<>(Filters.eq("name", "Zaynab Omar"), Updates.set("name", "Zaynab Hassan")); // Creates instructions to delete all documents matched by the query DeleteManyModel<Document> deleteDoc = new DeleteManyModel<>(Filters.gt("age", 50)); bulkOperations.add(insertDoc); bulkOperations.add(replaceDoc); bulkOperations.add(updateDoc); bulkOperations.add(deleteDoc); // Runs a bulk write operation for the specified the insert, replace, update, and delete WriteModels in order 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
のorder()
メソッドに「false」を指定することで、任意の順序で一括操作を実行できます。 つまり、すべての書き込み操作はエラーに関係なく実行され、エラーが発生した場合は一括操作によって最後にそれが報告されます。
前の例に追加することで、任意の順序で実行する一括操作を指定できます。
BulkWriteOptions options = new BulkWriteOptions().ordered(false); // Runs a bulk write operation for the specified insert, replace, update, and delete WriteModels in any order 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 ドキュメントを参照してください。
クライアント一括書込み (write)
MongoDB Server 8.0 以降を実行中配置に接続する場合、MongoClient.bulkWrite()
メソッドを使用して同じクラスター内の複数のデータベースとコレクションに書込み (write) できます。 MongoClient.bulkWrite()
メソッドは、1 回の呼び出しですべての書き込み操作を実行します。
MongoClient.bulkWrite()
メソッドは、さまざまな書込み操作を表すために ClientNamespacedWriteModel
インスタンスのリストを受け取ります。インスタンスメソッドを使用して、ClientNamespacedWriteModel
インターフェースのインスタンスを構築できます。例、ClientNamespacedInsertOneModel
のインスタンスは1 つのドキュメントを挿入する操作を表します。このモデルは ClientNamespacedWriteModel.insertOne()
メソッドを使用して作成できます。
注意
一括書き込みエラー
書き込み操作のいずれかが失敗した場合、ドライバーは ClientBulkWriteException
を発生させ、それ以上の個々の操作を実行しません。 ClientBulkWriteException
には ClientBulkWriteException.getWriteErrors()
メソッドを使用してアクセスできる BulkWriteError
が含まれており、個々の障害の詳細が提供されます。
モデルとそれに対応するインスタンスメソッドは、以下の表に説明されています。
モデル | インスタンス メソッド | 説明 | パラメーター |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次のセクションでは、クライアントのbulkWrite()
メソッドを使用する方法の例を示します。
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
挿入例
この例では、 bulkWrite()
メソッドを使用して 2 つのドキュメントを挿入する方法を示しています。一方のドキュメントは db.people
コレクションに挿入され、もう一方のドキュメントは db.things
コレクションに挿入されます。 MongoNamespace
インスタンスは、各書き込み操作が適用されるデータベースとコレクションを定義します。
MongoNamespace peopleNamespace = new MongoNamespace("db", "people"); MongoNamespace thingsNamespace = new MongoNamespace("db", "things"); List<ClientNamespacedWriteModel> bulkOperations = new ArrayList<>(); bulkOperations.add(ClientNamespacedWriteModel .insertOne( peopleNamespace, new Document("name", "Julia Smith") ) ); bulkOperations.add(ClientNamespacedWriteModel .insertOne( thingsNamespace, new Document("object", "washing machine") ) ); ClientBulkWriteResult result = mongoClient.bulkWrite(bulkOperations);
置き換えの例
次の例では、 bulkWrite()
メソッドを使用して、db.people
コレクションと db.things
コレクション内の既存のドキュメントを置き換える方法を示します。
MongoNamespace peopleNamespace = new MongoNamespace("db", "people"); MongoNamespace thingsNamespace = new MongoNamespace("db", "things"); List<ClientNamespacedWriteModel> bulkOperations = new ArrayList<>(); bulkOperations.add(ClientNamespacedWriteModel.replaceOne( peopleNamespace, Filters.eq("_id", 1), new Document("name", "Frederic Hilbert") ) ); bulkOperations.add(ClientNamespacedWriteModel.replaceOne( thingsNamespace, Filters.eq("_id", 1), new Document("object", "potato") ) ); ClientBulkWriteResult result = mongoClient.bulkWrite(bulkOperations);
この例が正常に実行されると、people
コレクション内の _id
値が 1
であるドキュメントは、新しいドキュメントに置き換えられます。 _id
値が 1
である things
コレクション内のドキュメントは、 新しいドキュメントに置き換えられます。
一括書込みオプション
一括書き込み操作を実行中ときにオプションを指定するには、ClientBulkWriteOptions
のインスタンスを bulkWrite()
メソッドに渡します。
実行順序の例
デフォルトでは 、一括操作内の個々の操作は、エラーが発生するまで、または正常に実行されるまで、指定された順序で実行されます。ただし、ClientBulkWriteOptions
インターフェースの ordered()
メソッドに false
を渡すと、順序なしで書込み操作を実行できます。順序なし オプションを使用する場合、エラーが発生する操作はbulkWrite()
メソッドの呼び出しで他の書込み操作の実行を妨げるものではありません。
次のコードでは、ClientBulkWriteOptions
のインスタンスに ordered()
メソッドを設定し、一括書込み操作を実行して複数のドキュメントを挿入します。
MongoNamespace namespace = new MongoNamespace("db", "people"); ClientBulkWriteOptions options = ClientBulkWriteOptions .clientBulkWriteOptions() .ordered(false); List<ClientNamespacedWriteModel> bulkOperations = new ArrayList<>(); bulkOperations.add( ClientNamespacedWriteModel.insertOne( namespace, new Document("_id", 1).append("name", "Rudra Suraj") ) ); // Causes a duplicate key error bulkOperations.add( ClientNamespacedWriteModel.insertOne( namespace, new Document("_id", 1).append("name", "Mario Bianchi") ) ); bulkOperations.add( ClientNamespacedWriteModel.insertOne( namespace, new Document("name", "Wendy Zhang") ) ); ClientBulkWriteResult result = mongoClient.bulkWrite(bulkOperations, options);
重複キーを持つドキュメントを挿入する書込み操作ではエラーが発生しますが、書込み操作は順序付けがないため、他の操作が実行されます。
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
概要
MongoCollection.bulkWrite()
一括操作を実行するには、作成して WriteModel
インスタンスのリストを bulkWrite()
メソッドに渡します。
6 には異なる WriteModel
サブタイプがあります: InsertOneModel
、ReplaceOneModel
、UpdateOneModel
、UpdateManyModel
、DeleteOneModel
、DeleteManyModel
bulkWrite()
メソッドを実行するには次の 2 つの方法があります。
順序付き: エラーが発生するまで一括操作を順番に実行します
順序付けなし: すべての一括操作を任意の順序で実行し、終了時にエラーを報告します
コレクションbulkWrite
コマンドの詳細については、 db を参照してください。 MongoDB Serverマニュアルのコレクション.bulkWrite() メソッド参照。
MongoClient.bulkWrite()
MongoDB Serverバージョン 8.0 以降を実行中配置に接続する場合、MongoClient.bulkWrite()
メソッドを使用して、複数のデータベースとコレクションに対して一括操作を一度に実行できます。
クライアント一括操作 を実行するには、ClientNamespacedWriteModel
インスタンスのリストを作成してこのメソッドに渡します。
書込み操作を表すために使用される ClientNamespacedWriteModel
には 6 つのサブタイプがあります。これらの書込みモデルを構築するには、対応する ClientNamespacedWriteModel
メソッド insertOne()
、updateOne()
、updateMany()
、replaceOne()
、deleteOne()
、deleteMany()
を使用できます。これらのメソッドは、書き込み先のデータベースとコレクションを定義する MongoNamespace
オブジェクトを受け取ります。
MongoClient.bulkWrite()
メソッドは ClientBulkWriteOptions
オブジェクトを受け取り、コマンドの実行方法に関するさまざまなオプションを指定することもできます。
クライアントbulkWrite
コマンドの詳細については、 MongoDB Serverマニュアルの bulkWrite() メソッドに関する参照を参照してください。