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

Управление миграцией монгоидов

Может ли кто-нибудь дать мне краткое введение для выполнения миграции БД в Rails с помощью Mongoid? Меня особенно интересует ленивая миграция документов. Под этим я подразумеваю, что всякий раз, когда вы читаете документ из базы данных, вы переносите его в свою последнюю версию и сохраняете его снова.

Кто-нибудь раньше делал подобные вещи? Я столкнулся с mongoid_rails_migrations, но он не предоставляет какой-либо документации, и хотя похоже, что он делает это, я не совсем уверен, как использовать его.

Я должен указать, что я только концептуально знаком с миграциями ActiveRecord.

4b9b3361

Ответ 1

Если вы хотите выполнить всю миграцию сразу, то mongoid_rails_migrations будут делать то, что вам нужно. Документировать не так уж и много, он дублирует функциональность стандартной миграции ActiveRecord. Вы пишете свои миграции, а затем используете rake db:migrate для их применения, и он обрабатывает выяснение, какие из них были и не были запущены. Я могу ответить на дополнительные вопросы, если есть что-то конкретное, о чем вы хотите знать.

Для ленивых миграций самым простым решением является использование after_initialize обратного вызова. Проверьте, соответствует ли поле старой схеме данных, и если вы его модифицируете и обновляете, например:

class Person
    include Mongoid::Document

    after_initialize :migrate_data

    field :name, :type => String

    def migrate_data
        if !self[:first_name].blank? or !self[:last_name].blank?
            self.set(:name, "#{self[:first_name]} #{self[:last_name]}".strip)
            self.remove_attribute(:first_name)
            self.remove_attribute(:last_name)
        end
    end
end

Компромиссы, которые следует помнить, с конкретным подходом, который я дал выше:

Если вы запустите запрос, который возвращает много записей, например Person.all.each {|p| puts p.name} и 100 человек имеют старый формат, он сразу же запустит 100 заданных запросов. Вы можете также вызвать self.name = "#{self.first_name} #{self.last_name}".strip вместо этого, но это означает, что ваши данные будут перенесены только в том случае, если запись сохранена.

Общие проблемы, которые могут возникнуть у вас, это то, что любые массовые запросы, такие как Person.where(:name => /Foo/).count, будут терпеть неудачу, пока все данные не будут перенесены. Также, если вы выполняете Person.only(:name).first, миграция завершится неудачно, потому что вы забыли включить поля first_name и last_name.

Ответ 2

Захари Анкер многое объяснил в своем ответе. Использование mongoid_rails_migrations - хороший вариант для миграции.

Вот некоторые ссылки с примером, которые будут полезны для вас, и используйте mongoid_rails_migrations

Монгоидные миграции с использованием Mongo Driver

Вложение монгольских документов и миграция данных

Другое, тогда это Readme должно быть достаточно, чтобы этот пример реализовал миграцию mongoid

Ответ 3

У меня такая же потребность.

Вот что я придумал: https://github.com/nviennot/mongoid_lazy_migration

Я с удовольствием позабочусь о некоторой обратной связи