В предыдущих темах было рассмотрено, как использовать различные методы для операций записи, то есть добавления, редактирования, удаления.
Для каждой операции есть пара методов, которая работает с одним или несколькими документами: 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 }
Метод 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}");