Overview
このガイドでは、MongoDB Java ドライバーで一括操作を使用する方法を学習できます。
作成、置換、更新、または削除の操作を実行するには、対応するメソッドを使用します。 たとえば、1 つのドキュメントを挿入し、複数のドキュメントを更新し、コレクション内の 1 つのドキュメントを削除するには、 insertOne() 、 updateMany() 、 deleteOne()メソッドを使用します。
MongoClientは、各操作に対してデータベースを呼び出すことでこれらの操作を実行します。 一括操作を使用することで、データベースへの呼び出し回数を 1 回に減らすことができます。
一括操作の実行
一括操作は、多数の書込み (write) 操作で構成されています。 一括操作を実行するには、 WriteModelドキュメントのListをbulkWrite()メソッドに渡します。 WriteModelは、書込み操作のいずれかを表すモデルです。
次のセクションでは、各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 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 API Documentation
UpdateManyModel APIドキュメント
一意なインデックスサーバー マニュアルの説明
削除操作
削除操作を実行するには、削除するドキュメントのクエリフィルターを指定する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 ドキュメントを参照してください。
概要
一括操作を実行するには、作成してWriteModelドキュメントのリストをbulkWrite()メソッドに渡します。
WriteModelドキュメントには次の 6 個があります: InsertOneModel 、 ReplaceOneModel 、 UpdateOneModel 、 UpdateManyModel 、 DeleteOneModel 、 DeleteManyModel 。
bulkWrite()メソッドを実行するには次の 2 つの方法があります。
順序付き: エラーが発生するまで一括操作を順番に実行します
順序付けなし: すべての一括操作を任意の順序で実行し、終了時にエラーを報告します