Docs Menu
Docs Home
/ / /
C#/.NET
/ / /

一括書き込み操作

項目一覧

  • Overview
  • サンプル データ
  • 書込み (write) 操作を定義する
  • 挿入操作
  • アップデート操作
  • 置換操作
  • 削除操作
  • 書込み操作の実行
  • 一括書き込み操作をカスタマイズ
  • 戻り値
  • 例外の処理
  • 詳細情報

このガイドでは、 .NET/ C#ドライバーを使用して、 MongoClientインスタンスから一括書き込み操作を実行する方法を説明します。一括書込み操作は、1 つ以上のMongoDBコレクションに対して複数の書込み操作を実行する単一のデータベース呼び出しです。 これは、アプリケーションとデータベース間のラウンド トリップの回数を減らすため、複数の個別の書き込み操作を実行するよりも効率的です。

このガイドの例では、sample_restaurants.restaurants Atlasサンプルデータセット の コレクションを使用します。無料のMongoDB Atlasクラスターを作成し、サンプルデータセットをロードする方法については、 クイック スタート チュートリアルを参照してください。

実行する書込み操作ごとに、次のいずれかの 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
説明
collectionNamespace
document
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
説明
collectionNamespace
The database and collection to insert the BSON document into.

Data Type: string or CollectionNamespace
filter
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.

update
The update operation you want to perform. For more information about update operations, see Field Update Operators in the MongoDB Server manual.

collation
Optional. The language collation to use when sorting results. See the {+mdb+server+} manual for more information.

Data Type: Collation
Default: null
hint
Optional. The index to use to scan for documents. See the MongoDB Server manual for more information.

Data Type: BsonValue
Default: null
isUpsert
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
arrayFilters
Specifies which array elements to modify for an update operation on an array field. See the MongoDB Server manual for more information.

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
説明
collectionNamespace
The database and collection to insert the BSON document into.

Data Type: string or CollectionNamespace
filter
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.

replacement
The replacement document, which specifies the fields and values to insert in the target document.

Data Type: TDocument
collation
Optional. The language collation to use when sorting results. See the MongoDB Server manual for more information.

Data Type: Collation
Default: null
hint
Optional. The index to use to scan for documents. See the MongoDB Server manual for more information.

Data Type: BsonValue
Default: null
isUpsert
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 以外のすべてのフィールドを削除し、namecuisineboroughrestaurant_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
説明
collectionNamespace
The database and collection to insert the BSON document into.

Data Type: string or CollectionNamespace
filter
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.

collation
Optional. The language collation to use when sorting results. See the MongoDB Server manual for more information.

Data Type: Collation
Default: null
hint
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 インターフェースを実装するクラスのインスタンスを作成します。この IReadOnlyListBulkWriteModel オブジェクトを追加し、IReadOnlyListBulkWrite() または BulkWriteAsync() メソッドに渡します。デフォルトでは 、これらのメソッドはコレクションで定義された順序で操作を実行します。

Tip

IReadOnlyList

ArrayList は、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クラスには、 一括書込み操作を構成するために使用できるオプションを表す次のプロパティが含まれています。

プロパティ
説明
BypassDocumentValidation
Specifies whether the operation bypasses document-level validation. For more information, see Schema Validation in the MongoDB Server manual.
Defaults to false.
Comment
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.
IsOrdered
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.
Let
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.
VerboseResult
Specifies whether the ClientBulkWriteResult object returned by the operation includes detailed results for each successful write operation.
Defaults to false.
WriteConcern
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オブジェクトを返します。

プロパティ
説明
Acknowledged
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.
DeleteResults
An IReadOnlyDictionary<int, BulkWriteDeleteResult> object containing the results of each successful delete operation, if any.
DeletedCount
The number of documents deleted, if any.
InsertResults
An IReadOnlyDictionary<int, BulkWriteInsertOneResult> object containing the results of each successful insert operation, if any.
InsertedCount
The number of documents inserted, if any.
MatchedCount
The number of documents matched for an update, if applicable.
ModifiedCount
The number of documents modified, if any.
UpsertResults
An IReadOnlyDictionary<int, BulkWriteUpdateResult> object containing the results of each successful update operation, if any.
UpsertedCount
The number of documents upserted, if any.

一括書き込み操作のいずれかの操作が失敗した場合、 .NET/ C#ドライバーは ClientBulkWriteException をスローし、それ以上の操作を実行しません。

ClientBulkWriteExceptionオブジェクトには次のプロパティが含まれています。

プロパティ
説明
connectionId
The connection identifier.

Data Type: ConnectionId
message
The error message.

Data Type: string
writeErrors
A dictionary of errors that occurred during the bulk write operation.

Data Type: IReadOnlyDictionary<int, WriteError>
partialResult
The results of any successful operations performed before the exception was thrown.

writeConcernErrors
Write concern errors that occurred during execution of the bulk write operation.

Data Type: IReadOnlyList<MongoWriteConcernException>
innerException
The inner exception.

Data Type: Exception

個々の書込み操作を実行する方法については、次のガイドを参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

Delete Documents