Так как MongoDB представляет документо-ориентированные базы данных, то все данные в ней хранятся в виде документов. Таким образом, база данных состоит из коллекций, а коллекции - из документов. Каждый документ, в свою очередь, состоит из элементов, каждый из которых представляет пару имя_элемента-значение_элемента.
На уровне драйвера MongoDB для .NET элементы представляет структура BsonElement из пространства имен MongoDB.BSON. Для создания и инициализации структуры можно использовать ее конструктор, который принимает два параметра:
public BsonElement(string name, BsonValue value)
Первый параметр представляет имя элемента, а второй - его значение. Причем в качестве значения принимается объект типа BsonValue. Однако поскольку BsonValue - абстрактный класс, мы будем передавать значения его наследников. Наиболее распространенные из них:
BsonArray
: представляет массив
BsonBinaryData
: представляет набор бинарных данных
BsonBoolean
: представляет логическое значение, аналогичен типу bool
BsonDateTime
: представляет дату и время, аналогичен типу DateTime
BsonDecimal128
: представляет числовое дробное значение, аналогичен типу decimal
BsonDouble
: представляет число с плавающей точков, аналогичен типу double
BsonInt32
: представляет 32-битное целочисленное значение, аналогичен типу int
BsonInt64
: представляет 64-битное целочисленное значение, аналогичен типу long
BsonNull
: представляет значение null
BsonObjectId
: представляет уникальный идентификатор
BsonString
: представляет строку, аналогичен типу string
Например, создадим элемент с именем "name" и значением "Tom":
using MongoDB.Bson; BsonElement el = new BsonElement("name", new BsonString("Tom")); Console.WriteLine(el); // name = Tom Console.WriteLine(el.Name); // name Console.WriteLine(el.Value); // Tom
С помощью свойств Name
и Value
можно получить соответственно имя и значение элемента.
Однако в реальности мы можем уйти от Bson-типов и использовать соответствующие базовые типы C#:
using MongoDB.Bson; BsonElement nameElement = new BsonElement("name", "Tom"); BsonElement ageElement = new BsonElement("age", 38); Console.WriteLine(nameElement); // name = Tom Console.WriteLine(ageElement); // age = 38
Коллекции в базах данных хранят документы, которые представлены классом BsonDocument из пространства имен MongoDB.BSON .
Для создания документа мы можем использовать одну из форм конструктора BsonDocument. Например, создадим пустой документ:
using MongoDB.Bson; BsonDocument doc = new BsonDocument(); Console.WriteLine(doc);
При выводе на консоль мы получим следующее:
{ }
Теперь создадим документ с одним элементом:
using MongoDB.Bson; BsonElement name = new BsonElement("name", "Tom"); BsonDocument doc = new BsonDocument(name); Console.WriteLine(doc); // { "name" : "Tom" }
И консоль отобразит следующее:
{ "name" : "Tom" }
Гораздо более простой способ инициализации объекта BsonDocument представляет использование инициализатора, в котором перечисляются все входящие в документ BsonElement.
BsonDocument doc = new BsonDocument{ {элемент1}, {элемент2}, ... {элементN}};
Например, перепишем предыдущий пример:
BsonDocument doc = new BsonDocument{{"name", "Tom"}};
Подобным образом можно создавать более сложные по композиции документы. При чем отдельные поля документа могут представлять вложенные документы. Например:
using MongoDB.Bson; BsonDocument doc = new BsonDocument { {"name","Tom"}, {"age", 38}, { "company", new BsonDocument{{"name" , "microsoft"}}}, {"languages", new BsonArray{"english", "german", "spanish" } } }; Console.WriteLine(doc);
Здесь документ doc содержит четыре элемента:
Элемент "name" со значением "Tom"
Элемент "age" со значением 38
Элемент "company" представляет отдельный вложенный BsonDocument, который, в свою очередь, содержит один элемент с именем "name" и значением "Microsoft"
Элемент "languages" представляет массив из трех строк "english", "german" и "spanish"
Консольный вывод программы:
{ "name" : "Tom", "age" : 38, "company" : { "name" : "microsoft" }, "languages" : ["english", "german", "spanish"] }
BsonDocument поддерживает индексаторы, которые позволяют обратиться к определенному элементу по имени:
using MongoDB.Bson; BsonDocument doc = new BsonDocument { {"name","Tom"}, {"age", 38}, { "company",new BsonDocument{{"name" , "microsoft"}}}, {"languages", new BsonArray{"english", "german", "spanish" } } }; // получаем значение поля name Console.WriteLine(doc["name"]); // Tom // получаем значение поля languages Console.WriteLine(doc["languages"]); // [english, german, spanish] // изменяем значение поля age doc["age"] = 22; Console.WriteLine(doc["age"]); // 22
С помощью методов класса BsonDocument мы можем управлять элементами внутри документа:
Add(): добавляет элемент в документ
AddRange(): добавляет набор элементов в документ
Clear(): удаляет все элементы из документа
Contains(): возвращает true, если в документе есть элемент с определенным именем
ContainsValue(): возвращает true, если в документе есть элемент с определенным значением
GetValue(): возвращает значение определенного элемента по имени или по позиции
Remove(): удаляет элемент из документа
Применение некоторых методов:
using MongoDB.Bson; BsonDocument doc = new BsonDocument{{"name","Bob"}}; BsonElement email = new BsonElement("email", "bob@localhost.com"); // добавляем элемент email doc.Add(email); Console.WriteLine(doc); // { "name" : "Bob", "email" : "bob@localhost.com" } // удаляем элемент name doc.Remove("name"); Console.WriteLine(doc); // { "email" : "bob@localhost.com" }