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:
Или с помощью .NET CLI с помощью команды:
dotnet add package MongoDB.Driver
Для подключения к серверу 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");
Итак, получив объект базы данных, мы можем обращаться к конкретным коллекциям и проводить различные операции с данными. И в следующих статьях мы рассмотрим базовый набор операций.