Подтвердить что ты не робот

Работа с изменениями схемы в Mongoose

Какая лучшая практика (или инструмент) для обновления/миграции схем Mongoose при разработке приложения?

4b9b3361

Ответ 1

Обновление: Протестировано, это не работает в его текущей форме, и у него есть правильная идея, я получил один переход для работы со значительной настройкой самого модуля. Но я не вижу, чтобы это работало, как предполагалось, без каких-либо серьезных изменений и каким-то образом отслеживать различные схемы.


Похоже, вы хотите, чтобы миграция mongoose-данных

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

На самом деле вы не хотите запускать полные миграции набора данных в коллекции документов (ala alter table), поскольку она сильно нагружает ваши серверы и может потребовать простоя приложений и серверов. Иногда вам может понадобиться написать script, который просто захватывает все документы, применяет новую схему/изменения и вызывает сохранение, но вам нужно понять, когда/где это сделать. Например, добавление логики миграции в doc init имеет больше производительности, чем удаление сервера в течение 3 часов для запуска сценариев миграции.

Я нашел эту ссылку довольно полезной, в основном повторяет вышеизложенное более подробно и по существу реализует вышеуказанную концепцию пакета node в php.

N.B. Модуль представляет собой 5-месячный старый, 0-вилки, но я оглядываюсь и не могу найти ничего лучшего/более полезного, чем стиль ответа от abdelsaid.

Ответ 2

Как ни странно, MongoDB родился, чтобы реагировать на проблемы схемы в РСУБД. Вам не нужно ничего переносить, все, что вам нужно сделать, - установить значение по умолчанию в определении схемы, если требуется поле.

new Schema({
    name: { type: string }
})

в

new Schema({
    name: { type: string },
    birthplace: { type: string, required: true, default: 'neverborn' }
});

Ответ 3

У меня была эта проблема, когда мне нужно было обновить мою базу данных, чтобы отразить изменения в моей схеме. После некоторого исследования я решил попробовать функцию updateMany() в консоли mongo, чтобы сделать обновления, и я думаю, что он работал очень хорошо.

Чтобы применить это к примеру vimdude, код выглядел бы следующим образом:

try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }

Функция updateMany() обновит все документы в коллекции на основе фильтра. В этом случае фильтр ищет все документы, где поле "Место рождения" равно null. Затем он устанавливает новое поле в тех документах, которые называются "местом рождения", и устанавливает его значение "никогда".

После запуска кода, измененного, чтобы отразить ваши обстоятельства:

db.<collection>.find().pretty()

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

Надеюсь, что это поможет.