MongoDB Анализ концепций

Независимо от того, какую базу данных мы изучаем, нам следует изучить её основные концепции. В MongoDB основные концепции — это документы, коллекции и базы данных. Ниже мы представим их по одной.

Следующая таблица поможет вам лучше понять некоторые концепции в MongoDB:

Термины/концепции SQL Термины/концепции MongoDB Объяснение/описание
база данных база данных Базы данных
table коллекция Таблица базы данных/Коллекция
row document Строка записи данных/Документ
column поле Поле данных/Поле
index index Index
объединения таблиц   Объединения таблиц, не поддерживаемые MongoDB
первичный ключ первичный ключ Первичный ключ, MongoDB автоматически устанавливает поле _id в качестве первичного ключа

На примере, представленном на рисунке ниже, мы также можем более наглядно понять некоторые концепции в MongoDB:

Полный список терминов:

  • Документ: Базовая единица данных MongoDB, обычно структура, подобная JSON, которая может содержать несколько типов данных.

  • Коллекция: Подобно таблице в реляционной базе данных, коллекция является контейнером для группы документов. В MongoDB документы в коллекции не обязаны иметь фиксированную схему.

  • База данных: Экземпляр MongoDB, содержащий одну или несколько коллекций.

  • BSON: Аббревиатура от Binary JSON; это двоичная форма JSON, которую MongoDB использует для хранения и передачи документов.

  • Индекс: Структура данных, используемая для оптимизации производительности запросов. Индексы могут быть созданы на основе одного или нескольких полей в коллекции.

  • Шардинг: Метод распределения данных по нескольким серверам (называемым шардами) для обработки больших наборов данных и приложений с высокой пропускной способностью.

  • Набор реплик: Группа серверов MongoDB, которые поддерживают один и тот же набор данных, обеспечивая избыточное резервное копирование данных и высокую доступность.

  • Первичный: Сервер в наборе реплик, отвечающий за обработку всех операций записи.

  • Вторичный: Сервер в наборе реплик, используемый для чтения данных и принимающий на себя роль первичного при отказе первичного узла.

  • Оболочка MongoDB: Интерфейс командной строки, предоставляемый MongoDB для взаимодействия с экземплярами MongoDB.

  • Фреймворк агрегации: Серия операций, используемых для выполнения сложной обработки данных и операций агрегации.

  • Map-Reduce: Модель программирования, используемая для параллельных вычислений над большими наборами данных.

  • GridFS: Спецификация для хранения и извлечения файлов, размер которых превышает ограничение на размер документа BSON.

  • ObjectId: Уникальный идентификатор, автоматически генерируемый MongoDB для каждого документа.

  • CRUD-операции: Операции создания, чтения, обновления и удаления.

  • Транзакции: Поддерживаются начиная с MongoDB 4.0, позволяя группе операций выполняться как единая атомарная единица.

  • Операторы: Специальные поля, используемые для запроса и обновления документов.

  • Объединение: MongoDB позволяет использовать$lookupоператор для реализации операций объединения, подобных SQL.

  • TTL(Time-To-Live): Вы можете установить TTL для определенных полей в коллекции, чтобы автоматически удалять старые данные.

  • Механизм хранения: Базовая технология, используемая MongoDB для хранения и управления данными, такая как WiredTiger и старый механизм хранения MongoDB MMAPv1.

  • MongoDB Compass: Графический инструмент MongoDB для визуализации и управления данными MongoDB.

  • MongoDB Atlas: Облачный сервис, предоставляемый MongoDB, который позволяет размещать базы данных MongoDB в облаке.


Базы данных

В одной MongoDB можно создать несколько баз данных.

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

Один экземпляр MongoDB может содержать несколько независимых баз данных, каждая со своими коллекциями и правами доступа. Разные базы данных также размещаются в разных файлах.

Начиная с MongoDB 4.0, поддерживаются многодокументные транзакции в одной базе данных.

"show dbs"Команда может отобразить список всех баз данных.

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local  0.078GB
test   0.078GB
> 

Выполните"db"Команда может отобразить текущий объект базы данных или коллекцию.

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
> 

Запуск команды "use" подключает к указанной базе данных.

> use local
switched to db local
> db
local
> 

В примере команды выше "local" — это база данных, к которой вы хотите подключиться.

В следующей главе мы подробно объясним использование команд в MongoDB.

Базы данных также идентифицируются по имени. Имя базы данных может быть любой строкой UTF-8, удовлетворяющей следующим условиям.

  • Не может быть пустой строкой ("").
  • Не должен содержать ' ' (пробел), ., $, /, \, и \0 (нулевой символ).
  • Должно быть в нижнем регистре.
  • Не более 64 байт.

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

  • admin: С точки зрения разрешений это "корневая" база данных. Если вы добавите пользователя в эту базу данных, пользователь автоматически наследует разрешения для всех баз данных. Некоторые специфические серверные команды можно выполнять только из этой базы данных, например перечисление всех баз данных или завершение работы сервера.
  • local:Эта база данных никогда не реплицируется и может использоваться для хранения любых коллекций, ограниченных одним локальным сервером.
  • config: Когда MongoDB используется в конфигурациях шардинга, база данных config внутренне используется для хранения информации, связанной с шардингом.: When MongoDB is used in sharding setups, the config database is used internally to save sharding-related information.

Документация

Документ — это набор пар ключ-значение (то есть BSON). Документы MongoDB не обязаны иметь одинаковые поля, и одинаковые поля не обязаны иметь одинаковые типы данных. Это важное отличие от реляционных баз данных и очень заметная особенность MongoDB.

Простой пример документа выглядит следующим образом:

{"site":"www.example.com", "name":"Example"}

В следующей таблице показаны соответствующие термины между РСУБД и MongoDB.

РСУБД MongoDB
Базы данных Базы данных
Таблица Коллекция
line Документация
Column Поле
Соединения таблиц Встроенный документ
Первичный ключ Первичный ключ (MongoDB предоставляет ключ как _id)
Сервер базы данных и клиент
Mysqld/Oracle mongod
mysql/sqlplus mongo

Следует отметить, что:

  1. Пары ключ/значение в документе упорядочены.
  2. Значения в документе могут быть не только строками, заключёнными в двойные кавычки, но и несколькими другими типами данных (даже целым встроенным документом).
  3. MongoDB различает типы и регистр.
  4. Документы MongoDB не могут иметь дублирующихся ключей.
  5. Ключи документа являются строками. За несколькими исключениями, ключи могут использовать любые символы UTF-8.

Соглашения об именовании ключей документа:

  • Ключи не могут содержать \0 (нулевой символ). Этот символ используется для обозначения конца ключа.
  • . и $ имеют особые значения и могут использоваться только в определённых обстоятельствах.
  • Ключи, начинающиеся с подчёркивания "_", зарезервированы (не строго обязательно).

Коллекция

Коллекция — это группа документов MongoDB, аналогичная таблице в RDBMS (реляционная система управления базами данных).

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

Например, мы можем вставить в коллекцию документы со следующими различными структурами данных:

{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.example.com","name":"Example","num":5}

Коллекция создаётся при вставке первого документа.

Допустимые имена коллекций

  • Имя коллекции не может быть пустой строкой "".
  • Имя коллекции не может содержать символ \0 (нулевой символ). Этот символ обозначает конец имени коллекции.
  • Имя коллекции не может начинаться с "system."; это префикс, зарезервированный для системных коллекций.
  • Имена коллекций, созданные пользователями, не могут содержать зарезервированные символы. Некоторые драйверы действительно поддерживают включение $ в имена коллекций, поскольку некоторые системные коллекции содержат этот символ. Если вам не нужно обращаться к таким созданным системой коллекциям, никогда не используйте $ в именах своих коллекций.

Следующий пример:

db.col.findOne()

capped-коллекции

Capped-коллекции — это коллекции фиксированного размера.

Они обладают высокой производительностью и характеристиками истечения очереди (истечение в порядке вставки). Это несколько похоже на концепцию "RRD".

Capped-коллекции обладают высокой производительностью и автоматически сохраняют порядок вставки объектов. Они отлично подходят для таких задач, как ведение журналов. В отличие от стандартных коллекций, capped-коллекцию необходимо создавать явно и указывать её размер в байтах. Место для хранения данных коллекции выделяется заранее.

Capped-коллекции могут хранить документы в порядке вставки, и их позиции на диске также сохраняются в порядке вставки. Поэтому при обновлении документов в capped-коллекции обновлённый документ не может превышать размер предыдущего документа. Это гарантирует, что позиции всех документов на диске останутся неизменными.

Поскольку capped-коллекция определяет позицию вставки по порядку вставки документов, а не с помощью индексов, это может повысить эффективность добавления данных. Файл журнала операций MongoDB oplog.rs реализован с использованием capped-коллекций.

Обратите внимание, что указанный размер хранилища включает информацию заголовка базы данных.

db.createCollection("mycoll", {capped:true, size:100000})
  • В capped-коллекцию можно добавлять новые объекты.
  • Обновления возможны; однако объекты не должны увеличивать занимаемое пространство. Если это произойдёт, обновление завершится ошибкой.
  • В capped-коллекции нельзя удалить документ. Для удаления всех строк коллекции можно использовать метод drop().
  • После удаления необходимо явно создать коллекцию заново.
  • На 32-битных машинах максимальный объём хранилища capped-коллекции составляет 1e9 (1X109) байт.

Метаданные

Информация базы данных хранится в коллекциях. Они используют системное пространство имён:

dbname.system.*

В MongoDB пространство имён <dbname>.system.* — это специальная коллекция (Collection), которая содержит различную системную информацию, как показано ниже:

Пространство имён коллекции Описание
dbname.system.namespaces Вывести список всех пространств имен.
dbname.system.indexes Вывести список всех индексов.
dbname.system.profile Содержит информацию профиля базы данных.
dbname.system.users Вывести список всех пользователей доступных баз данных.
dbname.local.sources Содержит информацию о сервере и состоянии узлов репликации (ведомых).

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

Вставка данных в {{system.indexes}} может создать индекс. Но кроме этого, информация в этой таблице неизменяема (специальная команда drop index автоматически обновит связанную информацию).

{{system.users}} можно изменять. {{system.profile}} можно удалить.


Типы данных MongoDB

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

Тип данных Описание
StringString. Распространённый тип данных для хранения данных. В MongoDB допустимы только строки в кодировке UTF-8.
IntegerInteger. Используется для хранения числовых значений. В зависимости от используемого сервера он может быть 32-битным или 64-битным.
BooleanBoolean. Используется для хранения логических значений (true/false).
DoubleDouble. Используется для хранения значений с плавающей запятой.
Ключи Min/MaxСравнивает значение с наименьшим и наибольшим значениями элементов BSON (Binary JSON).
МассивИспользуется для хранения массива, списка или нескольких значений в виде одного ключа.
Отметка времениTimestamp. Записывает конкретное время, когда документ был изменён или добавлен.
ObjectИспользуется для встроенных документов.
NullИспользуется для создания значения null.
СимволSymbol. Этот тип данных по сути эквивалентен строковому типу, но разница в том, что он обычно используется в языках, которые применяют специальный тип symbol.
DateDate. Хранит текущую дату или время в формате UNIX time. Вы можете указать свои дату и время: создайте объект Date и передайте информацию о годе, месяце и дне.
Object IDObject ID. Используется для создания идентификатора документа.
Бинарные данныеБинарные данные. Используется для хранения бинарных данных.
CodeТип Code. Используется для хранения кода JavaScript в документе.
Регулярное выражениеТип регулярного выражения. Используется для хранения регулярных выражений.

Ниже объясняются несколько важных типов данных.

ObjectId

ObjectId похож на уникальный первичный ключ; его можно быстро сгенерировать и отсортировать. Он содержит 12 байт, а именно:

  • Первые 4 байта представляют временну́ю метку созданияunix, среднее время по ГринвичуUTC, на 8 часов отстающее от пекинского времени
  • Следующие 3 байта — это код идентификатора машины
  • Следующие два байта состоят из идентификатора процесса (PID)
  • Последние три байта — это случайное число

Документы, хранящиеся в MongoDB, должны иметь ключ _id. Значение этого ключа может быть любого типа; по умолчанию это объект ObjectId.

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

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")

Преобразование ObjectId в строку

> newObject.str
5a1919e63df83ce79df8b38f

String

Строки BSON кодируются в UTF-8.

Отметка времени

В BSON есть специальный тип timestamp, используемый внутри MongoDB, который не связан с обычным типом Date. Значение timestamp — это 64-битное значение. Среди них:

  • Первые 32 бита — это значение time_t (количество секунд с начала эпохи Unix)
  • Последние 32 бита — это инкрементный порядковый номер для операций в пределах заданной секундыOrdinal number

В одном экземпляре mongod значения timestamp обычно уникальны.

В наборе реплик oplog имеет поле ts. Значение в этом поле использует BSON timestamp для представления времени операции.

Тип BSON timestamp в основном используется внутри MongoDB. В большинстве ситуаций разработки приложений можно использовать тип BSON date.

Date

Представляет количество миллисекунд с начала эпохи Unix (1 января 1970 года). Тип date является знаковым; отрицательные числа представляют даты до 1970 года.

> var mydate1 = new Date()     //格林尼治时间
> mydate1
ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1
object
> var mydate2 = ISODate() //格林尼治时间
> mydate2
ISODate("2018-03-04T15:00:45.479Z")
> typeof mydate2
object

Созданное таким образом время имеет тип date, и вы можете использовать методы типа Date в JS.

Возвращает строку типа time:

> var mydate1str = mydate1.toString()
> mydate1str
Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) 
> typeof mydate1str
string

или

> Date()
Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)   
Другие расширения