一括書き込み操作
Overview
このガイドでは、 .NET/ C#ドライバーを使用して、 MongoClient
インスタンスから一括書き込み操作を実行する方法を説明します。一括書込み操作は、1 つ以上のMongoDBコレクションに対して複数の書込み操作を実行する単一のデータベース呼び出しです。 これは、アプリケーションとデータベース間のラウンド トリップの回数を減らすため、複数の個別の書き込み操作を実行するよりも効率的です。
サンプル データ
このガイドの例では、sample_restaurants.restaurants
Atlasサンプルデータセット の コレクションを使用します。無料のMongoDB Atlasクラスターを作成し、サンプルデータセットをロードする方法については、 クイック スタート チュートリアルを参照してください。
書込み (write) 操作を定義する
実行する書込み操作ごとに、次のいずれかの BulkWriteModel
クラスのインスタンスを作成します。
BulkWriteInsertOneModel<TDocument>
BulkWriteUpdateOneModel<TDocument>
BulkWriteUpdateManyModel<TDocument>
BulkWriteReplaceOneModel<TDocument>
BulkWriteDeleteOneModel<TDocument>
BulkWriteDeleteManyModel<TDocument>
以下のセクションでは、前述のクラスのインスタンスを作成し、使用して、対応する書込み操作を一括書込みで実行する方法を示します。
Tip
POCO を使用した一括書き込み操作
このガイドの例では、すべてのジェネリック クラスの TDocument
型の BsonDocument
型を使用します。これらのクラスには Plain Old CLR Object(POCO) を使用することもできます。 そのためには、コレクション内のドキュメントを表すクラスを定義する必要があります。 クラスには、ドキュメント内のフィールドと一致するプロパティが必要です。 詳しくは、「 POCO 」を参照してください。
挿入操作
挿入操作を実行するには、 BulkWriteInsertOneModel<TDocument>
クラスのインスタンスを作成します。BulkWriteInsertOneModel<TDocument>
コンストラクターは次のパラメーターを受け入れます。
Parameter | 説明 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The document to insert into the collection. Data Type: TDocument |
次の例では、BulkWriteInsertOneModel<TDocument>
クラスのインスタンスを作成しています。このインスタンスは、"name"
フィールドが "Mongo's Deli"
であるドキュメントを sample_restaurants.restaurants
コレクションに挿入するようにドライバーに指示します。
var insertOneModel = new BulkWriteInsertOneModel<BsonDocument>( "sample_restaurants.restaurants", new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Manhattan" }, { "restaurant_id", "1234" } } );
Tip
複数のドキュメントの挿入
複数のドキュメントを挿入するには、挿入するドキュメントごとに BulkWriteInsertOneModel<TDocument>
クラスのインスタンスを作成します。
アップデート操作
単一のドキュメントを更新するには、BulkWriteUpdateOneModel<TDocument>
クラスのインスタンスを作成します。BulkWriteUpdateOneModel<TDocument>
コンストラクターは次のパラメーターを受け入れます。
Parameter | 説明 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The query filter that specifies the criteria used to match documents in your collection.
The UpdateOne operation updates only the first document that matches the
query filter.Data Type: FilterDefinition<TDocument> |
| The update operation you want to perform. For more information about update
operations, see Field Update Operators
in the MongoDB Server manual. Data Type: UpdateDefinition<TDocument> |
| Optional. The language collation to use when sorting results. See the
{+mdb+server+} manual
for more information. Data Type: Collation Default: null |
| Optional. The index to use to scan for documents.
See the MongoDB Server manual
for more information. Data Type: BsonValue Default: null |
| Optional. Specifies whether the update operation performs an upsert operation if no
documents match the query filter. See the MongoDB Server manual
for more information. Data Type: boolean Default: false |
| Specifies which array elements to modify for an update operation on an array field.
See the MongoDB Server manual
for more information. Data Type: IEnumerable<ArrayFilterDefinition> Default: null |
次の コード例では、BulkWriteUpdateOneModel<BsonDocument>
オブジェクトは sample_restaurants.restaurants
コレクションの更新操作を表しています。この操作は、name
フィールドの値が "Mongo's Deli"
であるコレクション内の最初のドキュメントと一致します。次に、一致したドキュメントの cuisine
フィールドの値を "Sandwiches and Salads"
にアップデートします。
var updateOneModel = new BulkWriteUpdateOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") );
複数のドキュメントを更新するには、BulkWriteUpdateManyModel<TDocument>
クラスのインスタンスを作成します。このクラスのコンストラクターは、BulkWriteUpdateOneModel<TDocument>
コンストラクターと同じパラメーターを受け入れます。BulkWriteUpdateManyModel<TDocument>
操作は、クエリフィルターに一致するすべてのドキュメントを更新します。
次の コード例では、BulkWriteUpdateManyModel<BsonDocument>
オブジェクトは sample_restaurants.restaurants
コレクションの更新操作を表しています。この操作は、name
フィールドの値が "Mongo's Deli"
であるコレクション内のすべてのドキュメントと一致します。次に、cuisine
フィールドの値を "Sandwiches and Salads"
にアップデートします。
var updateManyModel = new BulkWriteUpdateManyModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") );
置換操作
ドキュメント内のフィールドを置き換えるには、BulkWriteReplaceOneModel<TDocument>
クラスのインスタンスを作成します。BulkWriteReplaceOneModel<TDocument>
コンストラクターは次のパラメーターを受け入れます。
Parameter | 説明 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The query filter that specifies the criteria used to match documents in your collection.
The UpdateOne operation updates only the first document that matches the
query filter.Data Type: FilterDefinition<TDocument> |
| The replacement document, which specifies the fields and values to insert in the
target document. Data Type: TDocument |
| Optional. The language collation to use when sorting results. See
the MongoDB Server manual
for more information. Data Type: Collation Default: null |
| Optional. The index to use to scan for documents.
See the MongoDB Server manual
for more information. Data Type: BsonValue Default: null |
| Optional. Specifies whether the update operation performs an upsert operation if no
documents match the query filter.
See the MongoDB Server manual
for more information. Data Type: boolean Default: false |
次の例では、BulkWriteReplaceOneModel<BsonDocument>
オブジェクトは sample_restaurants.restaurants
コレクションに対する置換操作を表しています。この操作は、restaurant_id
フィールドの値が "1234"
であるコレクション内のドキュメントと一致します。次に、このドキュメントから _id
以外のすべてのフィールドを削除し、name
、cuisine
、borough
、restaurant_id
フィールドに新しい値を設定します。
var replaceOneModel = new BulkWriteReplaceOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234"), new BsonDocument{ { "name", "Mongo's Pizza" }, { "cuisine", "Pizza" }, { "borough", "Brooklyn" }, { "restaurant_id", "5678" } } );
Tip
複数のドキュメントの置換
複数のドキュメントを置き換えるには、置き換えるドキュメントごとに BulkWriteReplaceOneModel<TDocument>
クラスのインスタンスを作成します。
削除操作
ドキュメントを削除するには、BulkWriteDeleteOneModel<TDocument>
クラスのインスタンスを作成します。BulkWriteDeleteOneModel<TDocument>
コンストラクターは次のパラメーターを受け入れます。
Parameter | 説明 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The query filter that specifies the criteria used to match documents in your collection.
The DeleteOne operation deletes only the first document that matches the
query filter.Data Type: FilterDefinition<TDocument> |
| Optional. The language collation to use when sorting results. See
the MongoDB Server manual
for more information. Data Type: Collation Default: null |
| Optional. The index to use to scan for documents.
See the MongoDB Server manual
for more information. Data Type: BsonValue Default: null |
次のコード例では、BulkWriteDeleteOneModel<BsonDocument>
オブジェクトは sample_restaurants.restaurants
コレクションの削除操作を表しています。この操作は、restaurant_id
フィールドの値が "5678"
である最初のドキュメントを一致させ、削除します。
var deleteOneModel = new BulkWriteDeleteOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678") );
複数のドキュメントを削除するには、BulkWriteDeleteManyModel<TDocument>
クラスのインスタンスを作成し、削除するドキュメントを指定するクエリフィルターを渡します。DeleteMany
操作により、クエリフィルターに一致するすべてのドキュメントが削除されます。
次のコード例では、BulkWriteDeleteManyModel<BsonDocument>
オブジェクトは sample_restaurants.restaurants
コレクションの削除操作を表しています。この操作は、name
フィールドの値が "Mongo's Deli"
であるすべてのドキュメントを照合して削除します。
var deleteManyModel = new BulkWriteDeleteManyModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli") );
書込み操作の実行
実行する操作ごとに BulkWriteModel
インスタンスを定義したら、IReadOnlyList
インターフェースを実装するクラスのインスタンスを作成します。この IReadOnlyList
に BulkWriteModel
オブジェクトを追加し、IReadOnlyList
を BulkWrite()
または BulkWriteAsync()
メソッドに渡します。デフォルトでは 、これらのメソッドはコレクションで定義された順序で操作を実行します。
Tip
IReadOnlyList
Array
と List
は、IReadOnlyList
インターフェースを実装する 2 つの一般的なクラスです。
非同期 BulkWriteAsync()
メソッドと同期 BulkWrite()
メソッドを使用して 一括書込み操作を実行する方法を表示するには、次のタブから選択します。
var client = new MongoClient("mongodb://localhost:27017"); var collection = "sample_restaurants.restaurants"; var bulkWriteModels = new[] { new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Manhattan" }, { "restaurant_id", "1234" } } ), new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Brooklyn" }, { "restaurant_id", "5678" } } ), new BulkWriteUpdateManyModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") ), new BulkWriteDeleteOneModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234") ) }; var results = await client.BulkWriteAsync(bulkWriteModels); Console.WriteLine("Bulk write results: " + results);
var client = new MongoClient("mongodb://localhost:27017"); var collection = "sample_restaurants.restaurants"; var bulkWriteModels = new[] { new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Manhattan" }, { "restaurant_id", "1234" } } ), new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Brooklyn" }, { "restaurant_id", "5678" } } ), new BulkWriteUpdateManyModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") ), new BulkWriteDeleteOneModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234") ) }; var results = client.BulkWrite(bulkWriteModels); Console.WriteLine("Bulk write results: " + results);
上記のコード例では、次の出力が生成されます。
BulkWriteResult({'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 2, 'nUpserted': 0, 'nMatched': 2, 'nModified': 2, 'nRemoved': 1, 'upserted': []}, acknowledged=True)
一括書き込み操作をカスタマイズ
BulkWrite()
または BulkWriteAsync()
メソッドを呼び出すと、ClientBulkWriteOptions
クラスのインスタンスを渡すことができます。ClientBulkWriteOptions
クラスには、 一括書込み操作を構成するために使用できるオプションを表す次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
| Specifies whether the operation bypasses document-level validation. For more
information, see Schema
Validation in the MongoDB Server
manual. Defaults to false . |
| A comment to attach to the operation, in the form of a BsonValue . For
more information, see the delete command
fields guide in the
MongoDB Server manual. |
| If true , the driver performs the write operations in the order
provided. If an error occurs, the remaining operations are not
attempted.If false , the driver performs the operations in an
arbitrary order and attempts to perform all operations. If any of the write
operations in an unordered bulk write fail, the driver
reports the errors only after attempting all operations.Defaults to True . |
| A map of parameter names and values, in the form of a BsonDocument . 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. |
| Specifies whether the ClientBulkWriteResult object returned by the operation
includes detailed results for each successful write operation.Defaults to false . |
| The write concern to use for the write operation, as a value from the WriteConcern
enum.Defaults to the write concern of the collection on which the operation is running. |
次のコード例では、ClientBulkWriteOptions
オブジェクトを使用して削除操作をカスタマイズします。
var client = new MongoClient("mongodb://localhost:27017"); var deleteOneModel = new BulkWriteDeleteOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678") ); var clientBulkWriteOptions = new ClientBulkWriteOptions { IsOrdered = false, WriteConcern = WriteConcern.Unacknowledged, VerboseResult = true }; var results = await client.BulkWriteAsync(deleteOneModel, clientBulkWriteOptions);
var client = new MongoClient("mongodb://localhost:27017"); var deleteOneModel = new BulkWriteDeleteOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678") ); var clientBulkWriteOptions = new ClientBulkWriteOptions { IsOrdered = false, WriteConcern = WriteConcern.Unacknowledged, VerboseResult = true }; var results = client.BulkWrite(deleteOneModel, clientBulkWriteOptions);
戻り値
BulkWrite()
メソッドと BulkWriteAsync()
メソッドは、次のプロパティを含む ClientBulkWriteResult
オブジェクトを返します。
プロパティ | 説明 |
---|---|
| Indicates whether the server acknowledged the bulk write operation. If the
value of this property is false and you try to access any other property
of the ClientBulkWriteResult object, the driver throws an exception. |
| An IReadOnlyDictionary<int, BulkWriteDeleteResult> object containing the
results of each successful delete operation, if any. |
| The number of documents deleted, if any. |
| An IReadOnlyDictionary<int, BulkWriteInsertOneResult> object containing the
results of each successful insert operation, if any. |
| The number of documents inserted, if any. |
| The number of documents matched for an update, if applicable. |
| The number of documents modified, if any. |
| An IReadOnlyDictionary<int, BulkWriteUpdateResult> object containing the
results of each successful update operation, if any. |
| The number of documents upserted, if any. |
例外の処理
一括書き込み操作のいずれかの操作が失敗した場合、 .NET/ C#ドライバーは ClientBulkWriteException
をスローし、それ以上の操作を実行しません。
ClientBulkWriteException
オブジェクトには次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
| |
| The error message. Data Type: string |
| A dictionary of errors that occurred during the bulk write operation. Data Type: IReadOnlyDictionary<int, WriteError> |
| The results of any successful operations performed before the exception was thrown. Data Type: ClientBulkWriteResult |
| Write concern errors that occurred during execution of the bulk write operation. Data Type: IReadOnlyList<MongoWriteConcernException> |
|
詳細情報
個々の書込み操作を実行する方法については、次のガイドを参照してください。
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。