C# и MongoDB

Установка драйвера и подключение к базе данных

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

MongoDB является одной из наиболее популярных баз данных, которая характеризуется быстродействием, масштабируемостью, относительной простотой. И для языка программирования C# и платформы .NET имеются все необходимые инструменты для работы с этой СУБД. Более подробно с MongoDB вне зависимости от языка программирования можно ознакомиться в отдельном материале по ссылке Руководство по MongoDB. В данном же руководстве мы сосредоточимся непосредственно на взаимодействии кода C# с MongoDB.

Для работы сначала необходимо установить саму MongoDB. Как это сделать, описано в соответстующей статье - Установка и начало работы с MongoDB

Фреймворк .NET и в частности язык C# работают с MongoDB через драйвер. Исходные файлы драйвера, а также разную необходимую информацию, например, что добавлено в новой версии, какие были сделаны улучшения и т.д., все это можно найти на странице на гитхабе: https://github.com/mongodb/mongo-csharp-driver/. Оттуда можно загрузить исходный код драйвера, либо его бинарные файлы.

Установка драйвера в проект

Итак, создадим простой консольный проект на C#. Далее для взаимодействия с сервером Mongo установим драйвер. Для этого необходимо через пакетный менеджер Nuget установить пакет MongoDB.Driver. Это можно сделать в Visual Studio:

Установка драйвера MongoDB через NuGet для C# и .NET

Или с помощью .NET CLI с помощью команды:

dotnet add package MongoDB.Driver

Подключение к базе данных. MongoClient

Для подключения к серверу MongoDB необходим класс MongoClient из пространства имен MongoDB.Driver. Для его создания объекта MongoClient можно применять ряд его конструкторов:

MongoClient()	
MongoClient(String)	
MongoClient(MongoClientSettings)	
MongoClient(MongoUrl)

Все кроме первого конструктора принимают в качестве параметра настройки подключения. Так, вторая версия получает в качестве параметра строку подключения. Она имеет следующий вид:

mongodb://[username:password@]hostname[:port][/[database][?options]]

Например, при указании всех параметров строка подключения могла бы выглядеть так:

mongodb://user:pass@127.0.0.1:27017/db1?authSource=userDb

в данном случае пользователь с логином user и паролем pass подключается к базе данных db1 по адресу 127.0.0.1 (то есть на локальной машине). Кроме того, также задается дополнительный параметр authSource со значением userDb.

Если порт не указан, то по умолчанию используется порт 27017.

Например, определим подключение к серверу mongodb на локальном компьютере (перед подключением должен быть запущен сервер mongod):

using MongoDB.Driver;

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

После создания объект MongoClient хранит пул подключений к серверу/серверам, которые указаны в строке подключения.

Стоит отметить, что комнада MongoDB рекомендует создавать один экземпляр MongoClient, например, в виде статической переменной или синглтона и использовать его в приложении. При создании множества объектов MongoClient все они будут использовать один и тот же пул подключений только в том случае, если совпадают их настройки подключения (например, если совпадает строка подключения). Однако не все типы настроек в MongoDB можно правильно сравнить. Подробнее о проблеме в документации.

После получения клиента с его помощью мы можем уже непосредственно обращаться к конкретным базам данных или получать информацию о них. Для этого у MongoClient можно использовать ряд методов:

  • ListDatabaseNames()/ListDatabaseNamesAsync(): возвращает имена всех баз данных на сервере

  • ListDatabases()/ListDatabasesAsync(): возвращает информацию обо всех базах данных на сервере

  • GetDatabase(): возвращает базу данных в виде объекта IMongoDatabase

  • DropDatabase()/DropDatabaseAsync(): удаляет базу данных по определенному имени

Получение списка баз данных на сервере

Например, получим список всех бд на сервере MongoDB с помощью метода ListDatabasesAsync():

using MongoDB.Driver;

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

using (var cursor = await client.ListDatabasesAsync())
{
    var databases = cursor.ToList();
    foreach (var database in databases)
    {
        Console.WriteLine(database);
    }
}

Метод ListDatabaseAsync() возвращает курсор - объект IAsyncCursor, из которого затем с помощью метода ToList() можно получить стандартный список C#/ Этот список хранит инфомацию о базах данных в виде объектов MongoDB.BSON.BSONDocument, которые мы подробнее далее разберем. Консольный вывод будет выглядеть примерно следующим образом:

{ "name" : "admin", "sizeOnDisk" : NumberLong(40960), "empty" : false }
{ "name" : "config", "sizeOnDisk" : NumberLong(73728), "empty" : false }
{ "name" : "local", "sizeOnDisk" : NumberLong(73728), "empty" : false }
{ "name" : "test", "sizeOnDisk" : NumberLong(147456), "empty" : false }

Каждая строка по сути представляет базу данных. Так, элемент "name" представляет имя базы данных, а "sizeOnDisk" - размер на диске.

Аналогично можно получить список имен баз данных

using MongoDB.Driver;

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

using (var cursor = await client.ListDatabaseNamesAsync())
{
    var databaseNames = cursor.ToList();
    foreach(string databaseName in databaseNames)
    {
        Console.WriteLine(databaseName);
    }
}

Обращение к базе данных

Для получения базы данных применяется метод GetDatabase, в который передается название базы. Этот метод возвращает объект IMongoDatabase:

using MongoDB.Driver;

MongoClient client = new MongoClient("mongodb://localhost:27017");
// получаем базу данных test
IMongoDatabase database = client.GetDatabase("test");

В данном случае идет получение ссылки на базу данных test, которая имеется в пакете mongodb по умолчанию. Если же мы передадим имя базы данных, которая отсутствует, то она автоматически создается при первых операциях с ней.

Стоит отметить, что реализация интерфейса IMongoDatabase по умолчанию потокобезопасна, поэтому ее можно определить в приложении в качестве глобальной переменной или через IoC-контейнер.

После выполнения всех необходимых операций нам необязательно закрывать подключение (объект MongoClient), как, например, в случае с подключениями к другим базам данных, так как MongoDB сама выполнит всю работу.

Удаление базы данных

Для удаления БД применяются методы DropDatabase()/DropDatabaseAsync(), в которые передается имя удаляемой бд:

MongoClient client = new MongoClient("mongodb://localhost:27017");
// удаляем бд test2
await client.DropDatabaseAsync("test2");

Итак, получив объект базы данных, мы можем обращаться к конкретным коллекциям и проводить различные операции с данными. И в следующих статьях мы рассмотрим базовый набор операций.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850