Устройство базы данных. Документы

Всю модель устройства базы данных в MongoDB можно представить следующим образом:

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

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

В отличие от реляционных баз данных MongoDB не использует табличное устройство с четко заданным количеством столбцов и типов данных. MongoDB является документо-ориентированной системой, в которой центральным понятием является документ.

Документ можно представить как объект, хранящий некоторую информацию. В некотором смысле он подобен строкам в реляционных субд, где строки хранят информацию об отдельном элементе. Например, типичный документ:

        {
    "name": "Bill",
    "surname": "Gates",
    "age": "48",
    "company": {
        "name" : "microsoft",
        "year" : "1974",
        "price" : "300000"
        }
}
    

Документ представляет набор пар ключ-значение. Например, в выражении "name": "Bill" name представляет ключ, а Bill - значение.

Ключи представляют строки. Значения же могут различаться по типу данных. В данном случае у нас почти все значения также представляют строковый тип, и лишь один ключ (company) ссылается на отдельный объект. Всего имеется следующие типы значений:

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

        {
    "name": "Tom",
    "birthday": "1985.06.28",
    "place" : "Vashington",
    "languages" :[
        "english",
        "german",
        "spanish"
    ]
}
    

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

Еще пара важных замечаний: в MongoDB запросы обладают регистрозависимостью и строгой типизацией. То есть следующие два документа не будут идентичны:

        {"age" : "28"}
{"age" : 28}
    

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

Идентификатор документа

Для каждого документа в MongoDB определен уникальный идентификатор, который называется _id. При добавлении документа в коллекцию данный идентификатор создается автоматически. Однако разработчик может сам явным образом задать идентификатор, а не полагаться на автоматически генерируемые, указав соответствующий ключ и его значение в документе.

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

Если идентификатор не задан явно, то MongoDB создает специальное бинарное значение размером 12 байт. Это значение состоит из нескольких сегментов: значение типа timestamp размером 4 байта, идентификатор машины из 3 байт, идентификатор процесса из 2 байт и счетчик из 3 байт. Таким образом, первые 9 байт гарантируют уникальность среди других машин, на которых могут быть реплики базы данных. А следующие 3 байта гарантируют уникальность в течение одной секунды для одного процесса. Такая модель построения идентификатора гарантирует с высокой долей вероятности, что он будет иметь уникальное значение, ведь она позволяет создавать до 16 777 216 уникальных объектов ObjectId в секунду для одного процесса.

Получение информации о базе данных

use использовать или создать базу данных
show dbs показать базы данных
use имя_базы использовать базу (переключится на базу)
db имя текущий базы данных
db.stats() статистика текущей базы данных
db.имя_коллекции.stats() статистика по имя_коллекции
db.имя_коллекции.find() вывод коллекции в консоль
db.имя_коллекции.insertOne({"name": "Tom"}) Добавление документа в коллекцию
db.users.insertMany([{"name": "Bob",},{"name": "Alice"}]) Добавление нескольких документов в коллекцию
db.users.insert({"name": "Tom"}) Универсальный способ добавления документов