Предположим, что у меня есть две коллекции A и B. Между прочим, одна из них (коллекция A) имеет массив, ячейки которого содержат поддокументы с несколькими ключами.
У меня также есть сценарий, который будет проходить через очередь (внешний по MongoDB), вставить его элементы в коллекцию B и вытолкнуть любую соответствующую информацию из этих элементов в поддокументы в массиве в коллекции A, используя $push
. По мере выполнения сценария размер документов в коллекции A значительно возрастает.
Проблема заключается в том, что всякий раз, когда документ не соответствует его выделенному размеру, MongoDB будет перемещать его внутренне, но он не освободит место, которое он занимал ранее --- новые документы MongoDB не будут использоваться это пробел, если только я не запустил команду compact
или repairDatabase
.
В моем случае скрипт, похоже, быстро окупится через мое дисковое пространство. Он вставляет несколько элементов в коллекцию B, затем пытается вставить в документ в коллекции A, и (я предполагаю) переносит указанный документ без повторного использования его старого места. Возможно, это случается не каждый раз, с дополнением, но когда эти документы имеют размер около 10 МБ, это означает, что каждый раз, когда он делает, это происходит через значительный фрагмент БД, хотя фактический размер данных остается небольшим. Процесс забирает мою (довольно маленькую, по общему признанию) БД за считанные минуты.
, требующая compact
или repairDatabase
команд каждый раз, когда это происходит неуклюж: есть это пространства на диске, и я хотел бы MongoDB, чтобы использовать его, не запрашивая его в явном виде. Альтернатива наличия отдельной коллекции для поддокументов в массиве могла бы устранить эту проблему, и, вероятно, это лучший дизайн, но тот, который потребует от меня создания объединений, которых я хотел избежать, что является одним из преимуществ NoSQL.
Итак, во-первых, действительно ли MongoDB использует пространство так, как я описал выше? Во-вторых, я подхожу к этому неправильно? Возможно, есть параметр, который я могу установить, чтобы заставить MongoDB использовать это пространство автоматически; если есть, целесообразно ли его использовать? И, в-третьих, существуют ли другие, более подходящие, дизайнерские подходы, которые мне не хватает?
Они повторно используются, они просто должны иметь документ, который подходит для этой позиции, и при вставке нового документа mongodb будет искать только первые 100 записей фрилансеров. – Sammaye