一括操作
Overview
このガイドでは、MongoDB Java ドライバーで一括操作を使用する方法を学習できます。
作成、置換、更新、または削除の操作を実行するには、対応するメソッドを使用します。 たとえば、1 つのドキュメントを挿入し、複数のドキュメントを更新し、コレクション内の 1 つのドキュメントを削除するには、 insertOne()
、 updateMany()
、 deleteOne()
メソッドを使用します。
MongoClient
は、各操作に対してデータベースを呼び出すことでこれらの操作を実行します。 一括操作を使用することで、データベースへの呼び出し回数を 1 回に減らすことができます。
一括操作の実行
一括操作は、多数の書込み (write) 操作で構成されています。 一括操作を実行するには、 WriteModel
ドキュメントのList
をbulkWrite()
メソッドに渡します。 WriteModel
は、書込み操作のいずれかを表すモデルです。
次のセクションでは、各WriteModel
ドキュメントの作成方法と使用方法を示します。 各セクションの例には、 コレクション内の次のドキュメントが含まれています。
{ "_id": 1 } { "_id": 2 }
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
挿入操作
挿入操作を実行するには、挿入するドキュメントを指定するInsertOneModel
を作成します。 複数のドキュメントを挿入するには、挿入するドキュメントごとにInsertOneModel
を作成する必要があります。
例
次の例では、 _id
の値が「3」と「4」である 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
を持つドキュメントが挿入されなかった理由については、「実行順序 」セクションを参照してください。
置換操作
置換操作を実行するには、置換ドキュメントで置き換えるドキュメントのクエリフィルターを指定するReplaceOneModel
を作成します。
重要
bulkWrite()
を実行する場合、 ReplaceOneModel
はコレクションの一意のインデックス制約に違反するドキュメントを変更できません。クエリフィルターに一致しない場合は、モデルはドキュメントを置換しません。
例
次の例では、 ReplaceOneModel
を作成して、 _id
が「1」であるドキュメントを、追加の フィールドを含むドキュメントに置き換えます。
ReplaceOneModel<Document> doc3 = new ReplaceOneModel<>( Filters.eq("_id", 1), new Document("name", "Celine Stork") .append("location", "San Diego, CA"));
このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。
ReplaceOneModel API ドキュメント
一意なインデックスサーバー マニュアルの説明
アップデート操作
アップデート操作を実行するには、アップデート内容を使用してアップデートするドキュメントのクエリフィルターを指定するUpdateOneModel
またはUpdateManyModel
を作成します。
UpdateOneModel
はクエリフィルターに一致する最初のドキュメントを更新し、 UpdateManyModel
はクエリフィルターに一致するすべてのドキュメントを更新します。
重要
bulkWrite()
を実行する場合、 UpdateOneModel
とUpdateManyModel
はコレクションの一意のインデックス制約に違反するドキュメントを変更できません。クエリフィルターに一致しない場合、モデルはドキュメントを更新しません。
例
次の例では、 UpdateOneModel
を作成して、 _id
が「2」であるドキュメントを追加のフィールドを含むドキュメントに更新します。
UpdateOneModel<Document> doc3 = new UpdateOneModel<>( Filters.eq("_id", 2), Updates.set("x", 8));
このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。
UpdateOneModel API Documentation
UpdateManyModel API ドキュメント
一意なインデックスサーバー マニュアルの説明
削除操作
削除操作を実行するには、削除するドキュメントのクエリフィルターを指定するDeleteOneModel
またはDeleteManyModel
を作成します。
DeleteOneModel
はクエリフィルターに一致する最初のドキュメントを削除し、 DeleteManyModel
はクエリフィルターに一致するすべてのドキュメントを削除します。
重要
bulkWrite()
を実行するとき、クエリフィルターに一致しない場合、 DeleteOneModel
とDeleteManyModel
はドキュメントを削除しません。
例
次の例では、 _id
が「1」であるドキュメントを削除するためにDeleteOneModel
を作成します。
DeleteOneModel<Document> doc3 = new DeleteOneModel<>(Filters.eq("_id", 1));
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
実行順序
bulkWrite()
メソッドでは、一括操作を順序付きで実行するか、順序なしで実行するかを指定する 2 番目のパラメーターとして任意のBulkWriteOptions
を受け入れます。
順序付き実行
デフォルトでは、 bulkWrite()
メソッドは一括操作を順番に実行します。 つまり、エラーが発生するまで、一括操作はリストに追加した順序で実行されます(存在する場合)。
例
次の例では、これらの一括操作を実行します。
_id
が「3」であるドキュメントの挿入操作_id
が 1 であるドキュメントを、追加のフィールドを含むドキュメントに置き換え操作追加のフィールドを含むドキュメントに対する、
_id
が「3」であるドキュメントの更新操作値が「2」であるフィールド
x
を含むすべてのドキュメントの削除操作
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(doc1); bulkOperations.add(doc2); bulkOperations.add(doc3); bulkOperations.add(doc4); // Runs a bulk write operation for the specified the insert, replace, update, and delete WriteModels in order collection.bulkWrite(bulkOperations);
この例の実行後、コレクションには次のドキュメントが含まれます。
{ "_id": 2 }
順序なし実行
また、 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": 2 } { "_id": 3 }
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
概要
一括操作を実行するには、作成してWriteModel
ドキュメントのリストをbulkWrite()
メソッドに渡します。
WriteModel
ドキュメントには次の 6 個があります: InsertOneModel
、 ReplaceOneModel
、 UpdateOneModel
、 UpdateManyModel
、 DeleteOneModel
、 DeleteManyModel
。
bulkWrite()
メソッドを実行するには次の 2 つの方法があります。
順序付き: エラーが発生するまで一括操作を順番に実行します
順序付けなし: すべての一括操作を任意の順序で実行し、終了時にエラーを報告します