Подобно тому, как в обычных реляционных СУБД мы проходим несколько уровней при взаимодействии с сервером базы данных (сервер БД - > база данных -> таблица), так и при взаимодействии с MongoDB мы также проходим несколько уровней:
Ранее мы рассмотрели получение ссылки на базу данных с помощью объекта IMongoDatabase. Данные в базе данных хранятся в коллекциях, которые представлены объектом IMongoCollection. Для работы с коллекциями тип IMongoDatabase предоставляет ряд методов:
CreateCollection()/CreateCollectionAsync(): создает новую коллекцию
RenameCollection()/RenameCollectionAsync(): переименовывает коллекцию
GetCollection(): возвращает коллекцию
DropCollection()/DropCollectionAsync(): удаляет коллекцию
ListCollections()/ListCollectionsAsync(): возвращает список всех коллекций
ListCollectionNames()/ListCollectionNamesAsync(): возвращает список имен всех коллекций
Для создания коллекции применяются методы CreateCollection()/CreateCollectionAsync(), в которые передается имя создаваемой коллекции. Например, создадим в базе данных test коллекцию "people".
using MongoDB.Driver; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); await db.CreateCollectionAsync("people"); // создаем коллекцию "people"
После создания коллекции people посмотрим, какие вообще коллекции у нас есть в базе данных. Для этого применяются методы ListCollections()/ListCollectionsAsync().
Они возвращают курсор, из которого с помощью метода ToList()
можно получить стандартный список List:
using MongoDB.Driver; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); var collections = await db.ListCollectionsAsync(); foreach(var collection in collections.ToList()) { Console.WriteLine(collection); }
Информация о каждой коллекции представояет сложный объект, для представления которого применяется json-подобная нотация. Например, в моем случае после добавления коллекции "people" я получу следующий консольный вывод:
{ "name" : "people", "type" : "collection", "options" : { }, "info" : { "readOnly" : false, "uuid" : CSUUID("4352486e-32fa-4ad8-bf08-cf114eb86bbe") }, "idIndex" : { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } }
Так, мы видим, что в бд только одна коллекция. И во всей этой информации нас пока будет интересовать свойство "name", которое в данном случае равно "people".
Если нас интересуют только имена коллекций, то мы можем использовать другой метод - ListCollectionNames()/ListCollectionNamesAsync():
var collections = await db.ListCollectionNamesAsync(); foreach(var collection in collections.ToList()) { Console.WriteLine(collection); }
Для переименования коллекции применяются методы RenameCollection()/RenameCollectionAsync(), которые принимают название коллекции, которую надо переименовать, и новое название. Например, переименуем коллекцию "people" в "users":
using MongoDB.Driver; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); await db.RenameCollectionAsync("people", "users"); // из people в users
Для удаления коллекции применяются методы DropCollection()/DropCollectionAsync(), в которые передается имя удаляемой коллекции. Например, удалим коллекцию "users".
using MongoDB.Driver; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); await db.DropCollectionAsync("users"); // удаляем коллекцию "users"
Для взаимодействия с коллекцией, работы с ее данными нам необходимо получить саму эту коллекцию. Для этого необходимо вызвать метод GetCollection<TDocument>.
Этот метод типизируется типом документов, которые хранит коллекция. Обычно в качестве такого типа применяется тип BsonDocument из пространства имен MongoDB.Bson
, который мы далее рассмотрим.
Например, создадим и получим коллекцию "users":
using MongoDB.Bson; using MongoDB.Driver; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); await db.CreateCollectionAsync("users"); // создаем users // получаем коллекцию users IMongoCollection<BsonDocument> users = db.GetCollection<BsonDocument>("users");
В данном случае получаем коллекцию "users" в одноименную переменную. Объект IMongoCollection типизируется типом объектов, которые хранит коллекция. В данном случае
коллекция типизирован встроенным универсальным типом BsonDocument
, который представляет собой документ. А саму коллекцию можно представлять
как набор документов BsonDocument. И после этого мы сможем взаимодействовать с коллекцией users.
Стоит отметить, что реализация интерфейса IMongoCollection по умолчанию потокобезопасна, поэтому ее можно определить в приложении в качестве глобальной переменной или через IoC-контейнер и повторно использовать в различных частях приложения.