Понимание MongoDB BSON Ограничение размера документа

117

От MongoDB Полное руководство:

Документы размером более 4 МБ (при преобразовании в BSON) не могут быть сохранен в базе данных. Это несколько произвольный предел (и может быть в будущем); это главным образом предотвращение плохой схемы и стабильная производительность.

Я не понимаю этого предела, означает ли это, что документ, содержащий запись в блоге с большим количеством комментариев, которая просто так превышает 4 МБ, не может быть сохранена в виде единого документа?

Также это также считает вложенные документы?

Что делать, если мне нужен документ, который проверяет изменения в значении. (В конечном итоге он может вырасти, превысив предел в 4 МБ.)

Надеюсь, что кто-то объяснит это правильно.

Я только что начал читать о MongoDB (первая база данных nosql, о которой я узнал).

Спасибо.

  • 5
    Я думаю, что вопрос должен прояснить, что это ограничение размеров хранимых документов MongoDB, а не формата BSON.
  • 2
    @alexpopescu, ты прав.
Показать ещё 4 комментария
Теги:
bson

6 ответов

110
Лучший ответ

Во-первых, это в настоящее время поднимается в следующей версии до 8MB или 16MB... но я думаю, чтобы это было в перспективе, Элиот из 10gen (кто разработал MongoDB) ставит его лучше:

EDIT: Размер официально 'поднят' до 16MB

Итак, на примере вашего блога 4MB на самом деле много. Например, полный текст стиха "Война Миры" всего 364k (html): http://www.gutenberg.org/etext/36

Если ваш пост в блоге так долго что многие комментарии, я для меня не прочитав это:)

Для трекбэков, если вы выделили 1 МБ к ним вы могли бы легко получить больше чем 10k (вероятно, ближе к 20k)

Итак, за исключением поистине странных ситуации, это будет отлично работать. И в случай исключения или спам, я действительно не думайте, что вам нужен объект 20mb так или иначе. Я думаю, 15k или около того имеет большой смысл нет вопрос, что для исполнения. Или в наименее специальный корпус, если он когда-либо случается.

-Eliot

Я думаю, вам будет очень трудно достичь предела... и со временем, если вы обновите... вам придется беспокоиться все меньше и меньше.

Основная точка префикса заключается в том, что вы не используете всю RAM на своем сервере (так как вам нужно загрузить все MB документа в ОЗУ при его запросе.)

Таким образом, предел - это некоторый процент нормальной полезной ОЗУ на общей системе..., которая будет расти с каждым годом.

Примечание по сохранению файлов в MongoDB

Если вам нужно хранить документы (или файлы) больше, чем 16MB, вы можете использовать GridFS API, который автоматически разбивает данные в сегменты и передать их обратно вам (таким образом, избежать проблемы с ограничениями по размеру/оперативной памяти).

Вместо хранения файла в одном документе GridFS делит файл на части или куски и сохраняет каждый кусок в виде отдельного документа.

GridFS использует две коллекции для хранения файлов. Одна коллекция хранит фрагменты файлов, а другая хранит метаданные файлов.

Этот метод можно использовать для хранения изображений, файлов, видео и т.д. в базе данных так же, как и в базе данных SQL. Я использовал это для хранения видеофайлов с несколькими гигабайтами.

  • 0
    Я не очень понимаю, «главное ограничение - чтобы вы не использовали всю оперативную память на вашем сервере». Мы храним всю нашу базу данных MongoDB в оперативной памяти, так что это все еще проблема?
  • 2
    Удивительно, что у вас достаточно ОЗУ для всей вашей базы данных ... Обычно «рабочий набор» находится в ОЗУ, а не во всей базе данных (как в моем случае, у меня более одной базы данных по x ГБ, где, если все сложение будет превышать мою ОЗУ, но это нормально, потому что рабочий набор намного, намного меньше.) Кроме того, если бы не было предела, вы могли бы загрузить документ объемом 800 МБ в ОЗУ с одним запросом и документ объемом 400 КБ с другим, что немного затруднило бы балансировку ОЗУ и т. д. Таким образом, «лимит» составляет несколько% от типичной оперативной памяти сервера (таким образом, она увеличивается со временем.) Mongodb.org/display/DOCS/Checking+Server+Memory+Usage
Показать ещё 7 комментариев
23

Многие в сообществе не предпочтут никаких ограничений с предупреждениями о производительности, см. этот комментарий для аргумента с обоснованной аргументацией: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283

Мое мнение, ведущие разработчики упрямы в этом вопросе, потому что они решили, что это была важная "функция" на ранней стадии. Они не собираются менять его в ближайшее время, потому что их чувства страдают, что кто-то его спрашивал. Еще один пример личности и политики, умаляющий продукт в сообществах с открытым исходным кодом, но это не проблема, связанная с калекой.

  • 4
    Я полностью согласен с вами, так как теперь это противоречит цели встраивания документов, так как большинство встроенных документов теперь легко пересекают границы. Esp с массивом документов внутри них
  • 0
    @ marr75 сейчас написано исправлено, исправлено?
Показать ещё 3 комментария
18

Опубликовать ответ на разъяснение здесь для тех, кто направляется сюда Google.

Размер документа включает все документы, включая поддокументы, вложенные объекты и т.д.

Итак, документ:

{
    _id:{},
    na: [1,2,3],
    naa: [
        {w:1,v:2,b:[1,2,3]},
        {w:5,b:2,h:[{d:5,g:7},{}]}
    ]
}

Максимальный размер 16 мг.

Sbudocuments и вложенные объекты подсчитываются по размеру документа.

  • 0
    По иронии судьбы, самая большая структура, которая может быть представлена в BSON, также является самой компактной. Несмотря на то, что MongoDB внутренне использует индексы массива size_t (64-разрядные), ограничение размера документа в 16 МБ в лучшем случае сможет представлять собой документ, содержащий сам один массив, содержащий два миллиона NULL.
  • 0
    Извиняюсь, добавив второй комментарий, чтобы прояснить / уточнить еще одну важную деталь: когда вы говорите, что размер документа включает в себя все, что есть в документе , это также включает и ключи . Например, {"f": 1} на два байта меньше, чем {"foo": 1} . Это может быстро сложиться, если вы не будете осторожны, хотя современное сжатие на диске помогает.
5

Вложенная глубина для документов BSON: MongoDB поддерживает не более 100 уровней вложения для документов BSON.

Больше информации vist

3

Я еще не видел проблемы с лимитом, который не включал большие файлы, хранящиеся в самом документе. Уже существует множество баз данных, которые очень эффективны при хранении/извлечении больших файлов; они называются операционными системами. База данных существует как слой поверх операционной системы. Если вы используете решение NoSQL по соображениям производительности, почему вы хотите добавить дополнительные служебные данные для обработки ваших данных, поместив уровень БД между вашим приложением и вашими данными?

JSON - это текстовый формат. Таким образом, если вы получаете доступ к своим данным через JSON, это особенно актуально, если у вас есть двоичные файлы, потому что они должны быть закодированы в uuencode, шестнадцатеричном или Base 64. Путь преобразования может выглядеть как

двоичный файл < > JSON (закодированный) < > BSON (закодированный)

Было бы более удобно поместить путь (URL) в файл данных в вашем документе и сохранить сами данные в двоичном формате.

Если вы действительно хотите хранить эти файлы с неизвестной длиной в своей базе данных, то вам, вероятно, будет лучше помещать их в GridFS и не рискует убить ваш concurrency при доступе к большим файлам.

  • 1
    «Уже существует множество баз данных, которые очень эффективны для хранения / извлечения больших файлов; они называются операционными системами.»; См. Blog.mongodb.org/post/183689081/…
1

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

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

[править]

См. комментарии ниже для дальнейшего обсуждения.

  • 0
    Не знаю о лучшем дизайне на этой ранней стадии опыта. Книга дает небольшой пример блога. Отсюда и мысль. Благодарю.
  • 14
    Я совсем не согласен. Комментарии в ваших публикациях в блоге должны быть в порядке в MongoDB ... это очень распространенное использование (я использую его более чем в одном месте, и оно работает довольно хорошо).
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню