Docs Menu
Docs Home
/ / /
Java Sync Driver
/ / /

一括操作

項目一覧

  • Overview
  • 一括操作の実行
  • 挿入操作
  • 置換操作
  • アップデート操作
  • 削除操作
  • 実行順序
  • 順序付き実行
  • 順序なし実行
  • 概要

このガイドでは、MongoDB Java ドライバーで一括操作を使用する方法を学習できます。

作成、置換、更新、または削除の操作を実行するには、対応するメソッドを使用します。 たとえば、1 つのドキュメントを挿入し、複数のドキュメントを更新し、コレクション内の 1 つのドキュメントを削除するには、 insertOne()updateMany()deleteOne()メソッドを使用します。

MongoClientは、各操作に対してデータベースを呼び出すことでこれらの操作を実行します。 一括操作を使用することで、データベースへの呼び出し回数を 1 回に減らすことができます。

一括操作は、多数の書込み (write) 操作で構成されています。 一括操作を実行するには、 WriteModelドキュメントのListbulkWrite()メソッドに渡します。 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 ドキュメントを参照してください。

  • bulkWrite()

  • WriteModel

  • BulkWriteOptions

挿入操作を実行するには、挿入するドキュメントを指定する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をスローします。

次の例では、 _id13である 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を持つドキュメントが挿入されなかった理由については、「実行順序 」セクションを参照してください。

このセクションで述べられたメソッドとクラスの詳細については、次を参照して ください: API ドキュメント。

置換操作を実行するには、置換ドキュメントで置き換えるドキュメントのクエリフィルターを指定するReplaceOneModelを作成します。

重要

bulkWrite()を実行する場合、 ReplaceOneModelはコレクションの一意のインデックス制約に違反するドキュメントを変更できません。クエリフィルターに一致しない場合は、モデルはドキュメントを置換しません。

次の例では、 ReplaceOneModelを作成して、 _id1であるドキュメントを、 locationフィールドが追加されたドキュメントに置き換えます。

ReplaceOneModel<Document> celineDoc = new ReplaceOneModel<>(
Filters.eq("_id", 1),
new Document("name", "Celine Stork")
.append("location", "San Diego, CA"));

このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。

アップデート操作を実行するには、アップデート内容を使用してアップデートするドキュメントのクエリフィルターを指定するUpdateOneModelまたはUpdateManyModelを作成します。

UpdateOneModelはクエリフィルターに一致する最初のドキュメントを更新し、 UpdateManyModelはクエリフィルターに一致するすべてのドキュメントを更新します。

重要

bulkWrite()を実行する場合、 UpdateOneModelUpdateManyModelはコレクションの一意のインデックス制約に違反するドキュメントを変更できません。クエリフィルターに一致しない場合、モデルはドキュメントを更新しません。

次の例では、 _id2であるドキュメントのageフィールドを更新するためのUpdateOneModelを作成します。

UpdateOneModel<Document> updateDoc = new UpdateOneModel<>(
Filters.eq("_id", 2),
Updates.set("age", 31));

このセクションで述べられたメソッドとクラスの詳細については、次のリソースを参照してください。

削除操作を実行するには、削除するドキュメントのクエリフィルターを指定するDeleteOneModelまたはDeleteManyModelを作成します。

DeleteOneModelはクエリフィルターに一致する最初のドキュメントを削除し、 DeleteManyModelはクエリフィルターに一致するすべてのドキュメントを削除します。

重要

bulkWrite()を実行するとき、クエリフィルターに一致しない場合、 DeleteOneModelDeleteManyModelはドキュメントを削除しません。

次の例では、 _id1であるドキュメントを削除するためにDeleteOneModelを作成しています。

DeleteOneModel<Document> deleteDoc = new DeleteOneModel<>(Filters.eq("_id", 1));

このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。

bulkWrite()メソッドでは、一括操作の実行が順序付きか順序なしかを指定する 2 番目のパラメータとして任意のBulkWriteOptionsを受け入れます。

デフォルトでは、 bulkWrite()メソッドは一括操作を順番に実行します。 つまり、エラーが発生するまで、一括操作はリストに追加した順序で実行されます(存在する場合)。

次の例では、これらの一括操作を実行します。

  • : "Zaynab Omar"name値と37age値を持つドキュメントを挿入する操作

  • _id1であるドキュメントを、 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 }

また、 BulkWriteOptionsorder()メソッドに「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 個があります: InsertOneModelReplaceOneModelUpdateOneModelUpdateManyModelDeleteOneModelDeleteManyModel

bulkWrite()メソッドを実行するには次の 2 つの方法があります。

  • 順序付き: エラーが発生するまで一括操作を順番に実行します

  • 順序付けなし: すべての一括操作を任意の順序で実行し、終了時にエラーを報告します

戻る

アップサート