AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

一括書き込み操作

このガイドでは、 .NET/ C#ドライバーを使用して一括書込み操作を実行する方法を学習できます。一括書き込み操作を使用すると、データベースへの呼び出しで複数の書き込み操作を実行できます。

同じタスクでドキュメントの挿入、ドキュメントの更新、ドキュメントの削除が必要になる状況を考えてみましょう。 個別の書込みメソッドを使用して各タイプの操作を実行すると、各書込みはデータベースに個別にアクセスします。 一括書き込み操作を使用して、アプリケーションがサーバーに行う呼び出しの数を最適化できます。

IMongoCollection.BulkWrite() メソッドまたは IMongoCollection.BulkWriteAsync() メソッドを使用して、単一のコレクションに対して一括書き込み操作を実行できます。各メソッドは、実行する書込み操作を記述する WriteModel<TDocument> インスタンスのリストを受け取ります。

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

実行する書込み操作ごとに、次のいずれかの WriteModel<TDocument> クラスのインスタンスを作成します。

  • DeleteManyModel<TDocument>

  • DeleteOneModel<TDocument>

  • InsertOneModel<TDocument>

  • ReplaceOneModel<TDocument>

  • UpdateManyModel<TDocument>

  • UpdateOneModel<TDocument>

以下のセクションでは、前述のクラスのインスタンスを作成し、使用して、対応する書込み操作を一括書込み操作で実行する方法を示します。

Tip

POCO を使用した一括書き込み操作

このガイドの例では、すべてのジェネリック クラスの TDocument 型の BsonDocument 型を使用します。これらのクラスには Plain Old CLR Object(POCO) を使用することもできます。 そのためには、コレクション内のドキュメントを表すクラスを定義する必要があります。 クラスには、ドキュメント内のフィールドと一致するプロパティが必要です。 詳しくは、「 POCO 」を参照してください。

挿入操作を実行するには、 InsertOneModel<TDocument>インスタンスを作成し、挿入するドキュメントを指定します。

次の例では、InsertOneModel<BsonDocument>クラスのインスタンスを作成しています。このインスタンスは、"name"フィールドが "Mongo's Deli" であるドキュメントを restaurantsコレクションに挿入するようにドライバーに指示します。

var insertOneModel = new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Manhattan" },
{ "restaurant_id", "1234" }
}
);

複数のドキュメントを挿入するには、ドキュメントごとにInsertOneModel<TDocument>のインスタンスを作成します。

重要

重複キー エラー

一括操作を実行する場合、 InsertOneModel<TDocument>はコレクション内にすでに存在する_idを含むドキュメントを挿入できません。 この状況では、ドライバーはMongoBulkWriteExceptionをスローします。

単一のドキュメントを更新するには、UpdateOneModel<TDocument> のインスタンスを作成し、次の引数を渡します。

  • コレクション内のドキュメントをマッチングするために使用される基準を指定する クエリフィルター 。クエリの指定の詳細については、 MongoDB Serverマニュアルのクエリ演算子とプロジェクション 演算子を参照してください。

  • 実行する更新を説明する更新ドキュメント。更新を指定する方法の詳細については、 MongoDB Serverマニュアルの更新演算子を参照してください。

UpdateOneModel<TDocument>インスタンスは、クエリフィルターに一致する最初のドキュメントの更新を指定します。

次の コード例では、UpdateOneModel<BsonDocument>オブジェクトは restaurantsコレクションの更新操作を表しています。この操作は、nameフィールドの値が "Mongo's Deli" であるコレクション内の最初のドキュメントと一致します。次に、一致したドキュメントの cuisineフィールドの値を "Sandwiches and Salads" にアップデートします。

var updateOneModel = new UpdateOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
);

複数のドキュメントを更新するには、 UpdateManyModel<TDocument>のインスタンスを作成し、 UpdateOneModel<TDocument>と同じ引数を渡します。 UpdateManyModel<TDocument>クラスは、クエリフィルターに一致するすべてのドキュメントのアップデートを指定します。

次の コード例では、UpdateManyModel<BsonDocument>オブジェクトは restaurantsコレクションの更新操作を表しています。この操作は、nameフィールドの値が "Mongo's Deli" であるコレクション内のすべてのドキュメントと一致します。次に、cuisineフィールドの値を "Sandwiches and Salads" にアップデートします。

var updateManyModel = new UpdateManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
);

置換操作により、指定されたドキュメントのすべてのフィールドと値が削除され、指定した新しいフィールドと値に置き換えられます。 置換操作を実行するには、 ReplaceOneModel<TDocument>のインスタンスを作成し、クエリフィルターと、一致するドキュメントを置き換えるフィールドと値を渡します。

次の例では、ReplaceOneModel<BsonDocument>オブジェクトは restaurantsコレクションに対する置換操作を表しています。この操作は、restaurant_idフィールドの値が "1234" であるコレクション内のドキュメントと一致します。次に、このドキュメントから _id 以外のすべてのフィールドを削除し、namecuisineboroughrestaurant_id フィールドに新しい値を設定します。

var replaceOneModel = new ReplaceOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234"),
new BsonDocument{
{ "name", "Mongo's Pizza" },
{ "cuisine", "Pizza" },
{ "borough", "Brooklyn" },
{ "restaurant_id", "5678" }
}
);

複数のドキュメントを置き換えるには、ドキュメントごとにReplaceOneModel<TDocument>のインスタンスを作成する必要があります。

ドキュメントを削除するには、 DeleteOneModel<TDocument>のインスタンスを作成し、削除するドキュメントを指定するクエリフィルターを渡します。 DeleteOneModel<TDocument>インスタンスには、クエリフィルターに一致する最初のドキュメントのみを削除するための手順が記載されています。

次のコード例では、DeleteOneModel<BsonDocument>オブジェクトは restaurantsコレクションの削除操作を表しています。この操作は、restaurant_idフィールドの値が "5678" である最初のドキュメントを一致させ、削除します。

var deleteOneModel = new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678")
);

複数のドキュメントを削除するには、DeleteManyModel<TDocument> のインスタンスを作成し、削除するドキュメントを指定してクエリフィルターを渡します。DeleteManyModel<TDocument> のインスタンスには、 クエリフィルターに一致するすべてのドキュメントを削除するための手順が表示されます。

次のコード例では、DeleteManyModel<BsonDocument>オブジェクトは restaurantsコレクションの削除操作を表しています。この操作は、nameフィールドの値が "Mongo's Deli" であるすべてのドキュメントを照合して削除します。

var deleteManyModel = new DeleteManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli")
);

実行する操作ごとに WriteModelインスタンスを定義したら、IEnumerable インターフェースを実装するクラスのインスタンスを作成します。この IEnumerableWriteModel オブジェクトを追加し、IEnumerableBulkWrite() または BulkWriteAsync() メソッドに渡します。デフォルトでは 、これらのメソッドはリストで定義されている順序で操作を実行します。

Tip

IEnumerable

ArrayList は、IEnumerable インターフェースを実装する 2 つの一般的なクラスです。

同期 BulkWrite() メソッドと非同期 BulkWriteAsync() メソッドを使用して、restaurantsコレクションで一括書込み操作を実行する方法を表示するには、次のタブから を選択します。

var models = new List<WriteModel<BsonDocument>>
{
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Manhattan" },
{ "restaurant_id", "1234" }
}
),
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Brooklyn" },
{ "restaurant_id", "5678" }
}
),
new UpdateManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
),
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234")
)
};
var results = collection.BulkWrite(models);
Console.WriteLine(results);
var models = new List<WriteModel<BsonDocument>>
{
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Manhattan" },
{ "restaurant_id", "1234" }
}
),
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Brooklyn" },
{ "restaurant_id", "5678" }
}
),
new UpdateManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
),
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234")
)
};
var results = await collection.BulkWriteAsync(models);
Console.WriteLine(results);

上記のコード例では、次の出力が生成されます。

MongoDB.Driver.BulkWriteResult1+Acknowledged[MongoDB.Bson.BsonDocument]

注意

ドライバーが一括操作を実行する場合、ターゲット コレクションの書込み保証 (write concern) が使用されます。 ドライバーは、実行順序に関係なく、すべての操作を試行した後にすべての書込み保証 (write concern) エラーを報告します。

BulkWrite() または BulkWriteAsync() メソッドを呼び出すと、BulkWriteOptionsクラスのインスタンスを渡すことができます。BulkWriteOptionsクラスには、 一括書込み操作を構成するために使用できるオプションを表す次のプロパティが含まれています。

プロパティ
説明

BypassDocumentValidation

操作がドキュメントレベルの検証をバイパスするかどうかを指定します。詳細については、MongoDB Server マニュアルの「スキーマ検証」を参照してください。
デフォルトは False です。

Comment

BsonValue の形式で操作に添付するコメント。詳細については、MongoDB Server マニュアルの「削除コマンド フィールド」ガイドを参照してください。

IsOrdered

True の場合、ドライバーは指定された順序で書き込み操作を実行します。エラーが発生した場合、残りの操作は試行されません。

False の場合、ドライバーは操作を任意の順序で実行し、すべての操作を実行しようとします。順序付きでない一括書き込み内のいずれかの書き込み (write) 操作が失敗した場合、ドライバーはすべての操作を試行した後にのみエラーを報告します。
デフォルトは True です。

Let

パラメータ名と値のマップ(BsonDocument の形式)。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。

次のコード例では、BulkWriteOptionsオブジェクトを使用して順序なしの一括書込み操作を実行しています。

var models = new List<WriteModel<BsonDocument>>
{
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678")
)
};
var options = new BulkWriteOptions
{
IsOrdered = false,
};
collection.BulkWrite(models, options);
var models = new List<WriteModel<BsonDocument>>
{
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678")
)
};
var options = new BulkWriteOptions
{
IsOrdered = false,
};
await collection.BulkWriteAsync(models, options);

BulkWrite() メソッドと BulkWriteAsync() メソッドは、次のプロパティを含む BulkWriteResultオブジェクトを返します。

プロパティ
説明

IsAcknowledged

サーバーがバルク書き込み操作を認識したかどうかを示します。このプロパティの値が False で、BulkWriteResult オブジェクトの他のプロパティにアクセスしようとすると、ドライバーは例外をスローします。

DeletedCount

削除されたドキュメントの数。ある場合は。

InsertedCount

挿入されたドキュメントの数(存在する場合)。

MatchedCount

適用される場合は、更新に一致するドキュメントの数。

ModifiedCount

変更されたドキュメントの数(存在する場合)。

IsModifiedCountAvailable

変更されたカウントが利用可能かどうかを示します。

Upserts

アップサート操作により生成された各リクエストに関する情報を含むリスト。

RequestCount

一括操作におけるリクエストの数。

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

BulkWriteErrorオブジェクトには、エラーを発生させたリクエストのインデックスを記述する Indexプロパティが含まれています。

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

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