Я думаю, что это действительно хороший вопрос, но ответы будут немного разбросаны в зависимости от используемых вами библиотек и ваших ожиданий «миграции».
Давайте посмотрим нанекоторые распространенные действия по миграции:
- Добавить поле: Mongo делает это очень легко.Просто добавьте поле, и все готово.
- Удалить поле: Теоретически, вы на самом деле не привязаны к своей схеме, поэтому «удаление» здесь относительное.Если вы удалите «свойство» и больше не будете загружать поле, то на самом деле не имеет значения, находится ли это поле в данных.Поэтому, если вы не заботитесь о «очистке» базы данных, удаление поля не повлияет на базу данных.Если вы делаете заботитесь об очистке БД, вам, в основном, нужно запустить гигантский цикл for для БД.
- Изменить имя поля: Это такжесложная проблема.Когда вы переименовываете поле «где», вы переименовываете его?Если вы хотите, чтобы БД отображала имя нового поля, вам нужно выполнить гигантский цикл for в БД.Чтобы быть в безопасности, вам, вероятно, придется «добавить» данные, затем нажать код, а затем «сбросить» старое поле.
Некоторые морщины
ОднакоКонцепция имени поля в тандеме с объектом ActiveRecord немного искажена.Объект ActiveRecord эффективно обеспечивает сопоставление свойств объекта с фактическими полями базы данных.
В типичной СУБД «размер» имени поля на самом деле не имеет значения.Однако в Mongo имя поля фактически занимает пространство данных, и это сильно влияет на производительность.
Теперь, если вы используете какую-либо форму «объекта данных», такую как ActiveRecord, зачем вам пытатьсяхранить полные имена полей в данных?БД, вероятно, должна хранить все поля в алфавитном порядке с картой на стороне объекта.Таким образом, документ может иметь 8 полей / свойств, а имена БД будут «a», «b» ... «j», но имена объектов будут читабельными, например, «Имя», «Цена», «Количество».
Причина, по которой я поднимаю этот вопрос, заключается в том, что он добавляет еще одну складку к Измените имя поля .Если вы реализуете отображение, то изменение имени поля на самом деле вообще не вызывает миграции.
Еще несколько морщин
Если вы делаете хотите выполнить миграцию для удаления, тогда вам придется сделать это после развертывания.Вам также придется признать, что вы не будете экономить текущее дисковое пространство при этом.
Mongo предварительно выделяет пространство и на самом деле не «возвращает его», если вы не восстановите БД,Поэтому, если вы удалите кучу полей в документах, эти документы по-прежнему занимают то же место на диске.Если документы впоследствии будут перемещены, вы можете освободить место, однако документы будут перемещаться только по мере их увеличения.
Если вы удалите большое поле из большого количества документов, вы захотите сделать ремонт или проверитьновая команда compact
.