Перейти к содержанию

Коллекции

Коллекция представляет собой группу документов. Если в MongoDB документ является аналогом строки в реляционной СУБД, то коллекцию можно рассматривать как аналог таблицы.

Динамические схемы

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

1
2
{"greeting" : "Hello, world!", "views": 3}
{"signoff": "Good night, and good luck"}

Обратите внимание на то, что предыдущие документы имеют разные ключи, разное количество ключей и значения разных типов. Поскольку любой документ можно поместить в любую коллекцию, часто возникает вопрос: «Зачем вообще нужны отдельные коллекции?» Если нет необходимости в отдельных схемах для разных видов документов, зачем использовать дополнительные коллекции? На то есть ряд веских причин:

  • хранение разных видов документов в одной коллекции может стать кошмаром для разработчиков и администраторов. Разработчики должны убедиться, что каждый запрос возвращает только документы, привязанные к определенной схеме, или что код приложения, выполняющий запрос, может обрабатывать документы различной формы. Если мы запрашиваем посты в блоге, очень сложно отсеять документы, содержащие данные об авторах;
  • получить список коллекций намного быстрее, чем извлечь список типов документов в коллекции. Например, если бы в каждом документе было поле "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 для множества случаев использования.

Комментарии