Метод BulkWriteAsync

Последнее обновление: 28.10.2022

В предыдущих темах было рассмотрено, как использовать различные методы для операций записи, то есть добавления, редактирования, удаления. Для каждой операции есть пара методов, которая работает с одним или несколькими документами: UpdateOneAsync() / UpdateManyAsync(), InsertOneAsync() / InsertManyAsync() и DeleteOneAsync() / DeleteManyAsync(). Однако для увеличения производительности для массовой записи данных мы также можем применять метод BulkWriteAsync()

Метод BulkWriteAsync() в качестве параметра принимает массив объектов WriteModel, которые описывают разные операции:

  • DeleteOneModel / DeleteManyModel: удаление

  • UpdateOneModel / UpdateManyModel: обновление

  • InsertOneModel: добавление

  • ReplaceOneModel: замена

Например, добавим один документ:

using MongoDB.Bson;
using MongoDB.Driver;

MongoClient client = new MongoClient("mongodb://localhost:27017");

var db = client.GetDatabase("test"); 
var collection = db.GetCollection<BsonDocument>("people");

await collection.BulkWriteAsync(new WriteModel<BsonDocument>[]
{
    new InsertOneModel<BsonDocument>(new BsonDocument{{"Name", "Tom"}, {"Age", 38 } })
});

var people = await collection.Find("{}").ToListAsync();
foreach (var person in people) Console.WriteLine(person);

Для примера здесь в метод BulkWriteAsync передается массив WriteModel из одной модели - InsertOneModel, которая предназначена для добавления документа. Поскольку коллекция типизирована типом BsonDocument, то модель InsertOneModel тоже типизирована этим типом и соответственно в качестве параметра принимает и добавляет объект BsonDocument. В данном случае это документ из двух полей - "Name" и "Age".

new InsertOneModel<BsonDocument>(new BsonDocument{{"Name", "Tom"}, {"Age", 38 } })

И после выполнения метода BulkWriteAsync этот документ будет добавлен в коллекцию. И для проверки добавления выводим документы из коллекции на консоль:

{ "_id" : ObjectId("635c07308f09af14bc81ed93"), "Name" : "Tom", "Age" : 38 }

Но выполнение одной операции с помощью BulkWriteAsync не имеет большого смысла. Поэтому применим большее количество методов:

using MongoDB.Bson;
using MongoDB.Driver;

MongoClient client = new MongoClient("mongodb://localhost:27017");

var db = client.GetDatabase("test"); 
var collection = db.GetCollection<BsonDocument>("people");

// массовое добавление
await collection.BulkWriteAsync(new WriteModel<BsonDocument>[]
{
    new InsertOneModel<BsonDocument>(new BsonDocument{{"Name", "Sam"}, {"Age", 28 } }),
    new InsertOneModel<BsonDocument>(new BsonDocument{{"Name", "Bob"}, {"Age", 42 } }),
    new InsertOneModel<BsonDocument>(new BsonDocument{{"Name", "Alice"}, {"Age", 33 } })
});
Console.WriteLine("После добавления");
var people = await collection.Find("{}").ToListAsync();
foreach (var person in people) Console.WriteLine(person);
Console.WriteLine();

// изменение и удаление
await collection.BulkWriteAsync(new WriteModel<BsonDocument>[]
{
    // частичное изменение документа
    new UpdateOneModel<BsonDocument>(new BsonDocument("Name", "Sam"), new BsonDocument("$set", new BsonDocument("Age", 30))),
    // замена документа
    new ReplaceOneModel<BsonDocument>(new BsonDocument("Name", "Bob"), new BsonDocument{ {"Name", "Robert" }, {"Age", 44 } }),
    // удаление документа
    new DeleteOneModel<BsonDocument>(new BsonDocument("Name", "Alice"))
});

Console.WriteLine("После изменения");
people = await collection.Find("{}").ToListAsync();
foreach (var person in people) Console.WriteLine(person);

В данном случае программа условно состоит из двух частей. Сначала выполняется первый вызов метода BulkWriteAsync, который добавляет три документа. Затем второй вызов BulkWriteAsync обновляет, заменяет и удаляет по одному документу. Конструктор модели обновления UpdateOneMode, как и методы UpdateOneAsync/UpdateManyAsync в качестве первого параметра принимает фильтр документов, а в качестве второго параметра - параметры обновления. А конструктор модели замены ReplaceOneModel в качестве первого принимает фильтр документов, а в качестве второго - документ, на который надо заменить.

Консольный вывод программы:

После добавления
{ "_id" : ObjectId("635c07308f09af14bc81ed93"), "Name" : "Tom", "Age" : 38 }
{ "_id" : ObjectId("635c0ee0226b5a57a3d0dcc4"), "Name" : "Sam", "Age" : 28 }
{ "_id" : ObjectId("635c0ee0226b5a57a3d0dcc5"), "Name" : "Bob", "Age" : 42 }
{ "_id" : ObjectId("635c0ee0226b5a57a3d0dcc6"), "Name" : "Alice", "Age" : 33 }

После изменения
{ "_id" : ObjectId("635c07308f09af14bc81ed93"), "Name" : "Tom", "Age" : 38 }
{ "_id" : ObjectId("635c0ee0226b5a57a3d0dcc4"), "Name" : "Sam", "Age" : 30 }
{ "_id" : ObjectId("635c0ee0226b5a57a3d0dcc5"), "Name" : "Robert", "Age" : 44 }

BulkWriteResult

Метод BulkWriteAsync возвращает объект BulkWriteResult, который содержит результат операций в своих свойствах:

  • Upserts: содержит коллекцию добавленных элементов

  • InsertedCount: количество добавленных документов

  • MatchedCount: количество документов, которые соответствуют фильтру

  • ModifiedCount: количество обновленных документов

  • DeletedCount: количество удаленных документов

Например, получим информацию о выполнении операций:

using MongoDB.Bson;
using MongoDB.Driver;

MongoClient client = new MongoClient("mongodb://localhost:27017");

var db = client.GetDatabase("test"); 
var collection = db.GetCollection<BsonDocument>("people");

var result = await collection.BulkWriteAsync(new WriteModel<BsonDocument>[]
{
    new InsertOneModel<BsonDocument>(new BsonDocument{{"Name", "Alice"}, {"Age", 33 } }),
    new UpdateOneModel<BsonDocument>(new BsonDocument("Name", "Sam"), new BsonDocument("$set", new BsonDocument("Age", 32))),
    new ReplaceOneModel<BsonDocument>(new BsonDocument("Name", "Robert"), new BsonDocument("Name", "Bob")),
    new DeleteOneModel<BsonDocument>(new BsonDocument("Name", "Tom"))
}); ;

Console.WriteLine($"найдено соответствий: {result.MatchedCount};  добавлено: {result.InsertedCount}; " + 
    $"изменено: {result.ModifiedCount}; удалено: {result.DeletedCount}");
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850