Понимание MongoDB BSON Ограничение размера документа - PullRequest
134 голосов
/ 12 января 2011

Из MongoDB Подробное руководство:

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

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

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

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

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

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

Спасибо.

Ответы [ 7 ]

115 голосов
/ 12 января 2011

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

РЕДАКТИРОВАТЬ: Размер был официально"поднят" до 16MB

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

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

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

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

-Eliot

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

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

Таким образом, ограничение составляет несколько% от обычной используемой оперативной памяти в общей системе ... которая будет расти год от года.

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

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

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

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

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

27 голосов
/ 10 июля 2012

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

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

24 голосов
/ 16 октября 2013

Чтобы опубликовать разъясняющий ответ здесь для тех, кого направляет сюда 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 мг.

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

4 голосов
/ 17 апреля 2016

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

Дополнительная информация

4 голосов
/ 21 июня 2013

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

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

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

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

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

2 голосов
/ 12 января 2011

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

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

[править]

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

0 голосов
/ 24 апреля 2019

Согласно https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-1

Если вы ожидаете, что сообщение в блоге может превышать предел документа в 16 МБ, вы должны извлечь комментарии в отдельную коллекцию и сослаться на сообщение в блоге из комментария и подать заявку.Уровень соединения.

// posts
[
  {
    _id: ObjectID('AAAA'),
    text: 'a post',
    ...
  }
]

// comments
[
  {
    text: 'a comment'
    post: ObjectID('AAAA')
  },
  {
    text: 'another comment'
    post: ObjectID('AAAA')
  }
]
...