Связь MongoDB с концепцией объектно-ориентированных языков программирования (на примере C#)

При работе с реляционными базами данных многие уже наверняка сталкивались с понятием ORM. К счастью, организовать взаимодействие между приложением и базой данных на подобном уровне возможно и для некоторых NoSQL решений.

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

Рассмотрим как это работает в случае связки MongoDB и C#.

Создадим простой класс, который описывает сотрудника компании.

Инициализируем три его экземпляра:

Подключаемся к MongoDB:

Далее нам необходимо получить коллекцию документов. Но, с BSON, как предлагается в документации мы работать не будем. Вместо этого мы получим коллекцию документов — объектов класса Worker.

Таким образом мы формируем сопоставление (mapping) между документами в MongoDB и классом Worker.

Поочередно добавим созданные нами объекты класса Worker в коллекцию workers MongoDB:

Проверяем результат в консольном клиенте (mongo.exe).

Коллекция с добавленными документами

Все наши объекты были добавлены в коллекцию.

Обратите внимание. Мы ни разу не формировали BSON, а работали только с «обычными» объектами C#.

Но, у подобного подхода есть один недостаток.

Как видно на скриншоте MongoDB при добавлении документа в коллекцию создаёт поле «_id», которое служит ключом. В классе Worker его нет.

При операции добавления это роли не играет, так как новый ключ будет сформирован только когда данные будут переданы в MongoDB. Но, в случае выборки данных, их обновления или удаления это спровоцирует фатальную ошибку.

Поэтому перед тем, как выбрать документы добавим в класс Worker соответствующее поле.

Теперь наш класс полностью совместим с MongoDB.

Попробуем получить из базы данных записи со значениями TabNo меньше 10 в виде списка.

И здесь мы снова имеем дело только с объектами C#.

То же самое при обновлении уже существующего документа или его удалении.

Таким образом, при работе с MongoDB мы можем почти полностью отказаться от BSON и вместо него оперировать объектами C#. Это не только удобно, но и открывает новые возможности. В частности можно использовать в сочетании с MongoDB многие паттерны, которые хорошо зарекомендовали себя , но изначально были разработаны для реляционных СУБД (например, «Репозиторий»).

Однако, не всё так гладко. К сожалению, есть и «ложка дёгтя».

Помимо того, что сопоставление классов C# и документов MongoDB приходится делать полностью вручную, для данного подхода очень критична структура класса C#. Она должна полностью соответствовать структуре сопоставляемого документа, включая регистр.

Как это ни прискорбно, в MongoDB имена объектов базы данных регистрозависимые. Поэтому Id и id будут восприниматься как два разных поля.

Так как, MongoDB не накладывает никаких ограничений на документы в коллекциях, проверка на его стороне не предусмотрена. Так, что если между структурами документа и объекта C# будут обнаружены отличия, возникнет фатальная ошибка.

Все эти нюансы нужно обязательно учитывать при проектировании и реализации приложения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *