Как запустить миграцию, чтобы изменить тип поля в Mongoid/MongoDB без потери данных?Изменить тип поля в Mongoid без потери данных
В моем случае я пытаюсь преобразовать из BigDecimal (хранящегося в виде строки) в Integer, чтобы хранить деньги. Мне нужно преобразовать строковое десятичное представление в центы для целого числа. Я не хочу потерять существующие данные.
Я предполагаю, что шаги, может быть что-то вроде:
- создать новое поле типа Integer с новым именем, скажем
amount2
- развертывания производства и запустить миграцию (или задачу рейка), который преобразует каждый
amount
к правильному значению дляamount2
- (все это время существующего код все еще использует
amount
и нет времени простоя с точки зрения пользователей) - взять сайт вниз для технического обслуживания, бегите го е миграции еще раз, чтобы захватить любые
amount
поля, которые могли бы изменились за последние несколько минут - удалить
amount
и переименоватьamount2
вamount
- развернуть новый код, который ожидает
amount
быть целым - принести сайт обратно
похоже Mongoid предлагает rename
метод: http://mongoid.org/docs/persistence/atomic.html#rename
Но я немного запутался как это используется. Если у вас есть поле с именем amount2
(и вы уже удалили amount
), вы просто запустили Transaction.rename :amount2, :amount
? Тогда я предполагаю, что это немедленно нарушает базовое представление, поэтому после этого вы должны перезапустить сервер приложений. Что произойдет, если вы запустите это, пока amount
все еще существует? Переписывается ли он, не работает или пытается преобразовать его самостоятельно?
Спасибо!
. Звук похоже. Но я не уверен, нужен ли вам перезапуск или нет. Во-первых, вам нужно будет обновить имя поля в модели правильно? Что касается перезаписи, я не уверен, но это часть этой ссылки http://whyjava.wordpress.com/2012/02/07/how-to-rename-field-in-all-the-mongodb -documents /, похоже, предполагает, что он попытается написать и, возможно, переписать поле, если оно существует. Таким образом, это не похоже на регулярное переименование на основе SQL, а перемещение каждого значения документа по отдельности. Имеет смысл? –
Хм ... не уверен, хотел бы получить рабочий пример от начала до конца. Я отправлю его, если он пройдет успешно. –