Что касается 3 и 4, если вы вставляете во вложенный документ, это в основном обновление.
Это может быть ужасно плохо для вашей производительности, потому что вставки обычно добавляются в конец данных, что работает хорошо и быстро. С другой стороны, обновления могут быть намного сложнее.
Если ваше обновление не изменяет размер документа (это означает, что у вас была пара ключ / значение и вы просто изменили значение на новое значение, которое занимает столько же места), тогда вы будете в порядке, но когда вы начинайте изменять документы и добавлять новые данные, возникает проблема.
Проблема в том, что, хотя MongoDB выделяет больше места, чем необходимо для каждого документа, этого может быть недостаточно. Если вы вставляете документ размером 1 КБ, MongoDB может выделить 1,5 КБ для документа, чтобы у незначительных изменений в документе было достаточно места для увеличения. Если вы используете больше выделенного пространства, MongoDB должен извлечь весь документ и переписать его в конце данных.
Очевидно, что производительность извлекает и перезаписывает данные, что будет усиливаться частотой такой операции. Что еще хуже, когда это происходит, вы в конечном итоге оставляете дыры или карманы неиспользуемого пространства в ваших файлах данных.
В конечном итоге это копируется в память, что означает, что в конечном итоге вы можете использовать 2 ГБ ОЗУ для хранения набора данных, в то время как на самом деле сами данные занимают всего 1,5 ГБ, поскольку в карманах имеется 0,5 ГБ. Этой фрагментации можно избежать, выполняя вставки, а не обновления. Это также можно исправить, выполнив восстановление базы данных.
В следующей версии MongoDB появится функция онлайн-сжатия.