Коллекции¶
Коллекция представляет собой группу документов. Если в MongoDB документ является аналогом строки в реляционной СУБД, то коллекцию можно рассматривать как аналог таблицы.
Динамические схемы¶
Коллекции имеют динамические схемы. Это означает, что документы в одной коллекции могут иметь любое число различных «фигур». Например, оба приведенных ниже документа могут храниться в одной коллекции:
1 2 |
|
Обратите внимание на то, что предыдущие документы имеют разные ключи, разное количество ключей и значения разных типов. Поскольку любой документ можно поместить в любую коллекцию, часто возникает вопрос: «Зачем вообще нужны отдельные коллекции?» Если нет необходимости в отдельных схемах для разных видов документов, зачем использовать дополнительные коллекции? На то есть ряд веских причин:
- хранение разных видов документов в одной коллекции может стать кошмаром для разработчиков и администраторов. Разработчики должны убедиться, что каждый запрос возвращает только документы, привязанные к определенной схеме, или что код приложения, выполняющий запрос, может обрабатывать документы различной формы. Если мы запрашиваем посты в блоге, очень сложно отсеять документы, содержащие данные об авторах;
- получить список коллекций намного быстрее, чем извлечь список типов документов в коллекции. Например, если бы в каждом документе было поле "
type
", в котором указывалось, был ли это документ «skim», «whole» или «chunky monkey», было бы намного медленнее искать эти три значения в одной коллекции, чем иметь три отдельные коллекции и запросить правильную; - группировка документов одного и того же вида в одной коллекции допускает локальность данных. Получение нескольких постов в блоге из коллекции, содержащей только посты, вероятно, потребует меньше операций поиска на диске, нежели получение тех же постов из коллекции, где содержатся посты и данные об авторах;
- мы начинаем навязывать своим документам некую структуру при создании индексов. (Это особенно верно в случае с уникальными индексами.) Эти индексы определяются для каждой коллекции. Помещая в одну коллекцию только документы одного типа, можно более эффективно индексировать свои коллекции.
Существуют веские причины для создания схемы и группировки связанных типов документов. Хотя этого и не требуется по умолчанию, определение схем для вашего приложения является хорошей практикой и может быть реализовано с помощью функций проверки документации MongoDB и библиотек объектно-документного отображения, доступных для множества языков программирования.
Именование¶
Коллекция идентифицируется по имени. Имена коллекций могут быть любой строкой в кодировке UTF-8 с некоторыми ограничениями:
- пустая строка (
“”
) не является допустимым именем коллекции; - имена коллекций не могут содержать символ
\0
(нулевой символ), поскольку он обозначает конец имени коллекции; - не следует создавать коллекции с именами, начинающимися со слова
system
. Этот префикс зарезервирован для внутренних коллекций. Например, коллекцияsystem.users
содержит пользователей базы данных, а коллекцияsystem.namespaces
содержит информацию обо всех коллекциях базы данных; - созданные пользователем коллекции не должны содержать зарезервированный символ
$
в своих именах. Различные драйверы, доступные для базы данных, все же поддерживают применение этого символа в именах коллекций, потому что он содержится в некоторых сгенерированных системой коллекциях, но вы не должны использовать$
в имени, только если вы не выполняете доступ к одной из этих коллекций.
Вложенные коллекции¶
Одно из соглашений для организации коллекций состоит в том, чтобы использовать вложенные коллекции пространства имен, разделенные символом .
. Например, приложение, содержащее блог, может иметь коллекцию с именем blog.posts
и отдельную коллекцию с именем blog.authors
. Это служит только организационным целям – нет никакой связи между коллекцией blog
(она даже не должна существовать) и ее «потомками».
Хотя вложенные коллекции не имеют каких-либо специальных свойств, они полезны и включены во многие инструменты MongoDB. Например:
- GridFS, протокол для хранения больших файлов, использует вложенные коллекции для хранения метаданных файлов отдельно от блоков содержимого;
- большинство драйверов предоставляют некий «синтаксический сахар» для доступа к вложенной коллекции. Например, в оболочке базы данных
db.blog
предоставит вам коллекциюblog
, аdb.blog.posts
– коллекциюblog.posts
.
Вложенные коллекции – хороший способ организовать данные в MongoDB для множества случаев использования.