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

MongoMapper и миграции

Я создаю приложение Rails с использованием MongoDB в качестве внешнего и MongoMapper в качестве инструмента ORM. Предположим, что в версии 1 я определяю следующую модель:

class SomeModel
  include MongoMapper::Document
  key :some_key, String
end

Позже в версии 2 я понял, что мне нужен новый требуемый ключ для модели. Итак, в версии 2 SomeModel теперь выглядит так:

class SomeModel
  include MongoMapper::Document
  key :some_key, String
  key :some_new_key, String, :required => true
end

Как перенести все мои существующие данные, чтобы включить some_new_key? Предположим, что я знаю, как установить разумное значение по умолчанию для всех существующих документов. Сделав еще один шаг, предположим, что в версии 3 я понимаю, что мне действительно не нужна some_key. Итак, теперь модель выглядит так:

class SomeModel
  include MongoMapper::Document
  key :some_new_key, String, :required => true
end

Но все существующие записи в моей базе данных имеют значения, заданные для some_key, и просто теряют пространство на этом этапе. Как восстановить это пространство?

С ActiveRecord я бы только что создал миграции, чтобы добавить начальные значения some_new_key (в миграции version1 → version2) и удалить значения для some_key (в миграции версии 2 → версия 3).

Каким образом можно сделать это с помощью MongoDB/MongoMapper? Мне кажется, что необходим какой-то метод отслеживания миграции. Существует ли такая вещь?

EDITED: Я думаю, что люди не понимают моего вопроса. Бывают случаи, когда вы хотите запустить script в базе данных для изменения или реструктуризации данных в нем. Я привел два примера выше: тот, где был добавлен новый необходимый ключ, и тот, где можно удалить ключ, и пространство может быть восстановлено. Как вы управляете этими сценариями? Миграция ActiveRecord дает вам простой способ запускать эти сценарии и определять, какие скрипты уже запущены и какие сценарии не выполнялись. Я могу, очевидно, написать Mongo script, который делает любое обновление в базе данных, но то, что я ищу, - это инфраструктура, такая как миграции, которая позволяет мне отслеживать, какие сценарии обновления уже выполняются.

4b9b3361

Ответ 2

Один из вариантов - использовать операцию update для одновременного обновления всех ваших данных. Multi обновление является новым в релизах разработки, поэтому вам нужно будет использовать один из них.

Ответ 3

Вы можете попробовать это приспособление, которое я только что сделал, но он работает только с монгоидами и рельсами 3 (бета 3) на данный момент. http://github.com/adacosta/mongoid_rails_migrations. Он будет обновлен до рельсов 3, когда он станет окончательным.

Ответ 5

Монграции - это супер старый драгоценный камень, полностью устаревший. Я рекомендую НЕ использовать его.

Exodus - действительно классная среда миграции для Mongo, которая может быть тем, что вы хотите:

https://github.com/ThomasAlxDmy/Exodus

Ответ 6

Мы просто построим это: https://github.com/eberhara/mongration - это обычный модуль node (вы можете найти его на npm).

Нам нужна хорошая структура миграции mongodb, но мы не смогли найти ее, поэтому мы построили ее.

У этого есть много лучших функций, чем обычные рамки миграции:

  • Контрольная сумма (выдает сообщение об ошибке, когда предыдущая миграция не соответствует ее старой версии)
  • Сохраняет состояние миграции в mongo (нет обычного файла состояния)
  • Полная поддержка наборов реплик.
  • Автоматические откаты ручек (разработчики должны указать процедуры отката)
  • Возможность одновременного запуска нескольких миграций (синхронизация или асинхронная синхронизация)
  • Возможность одновременного запуска миграции по различным базам данных

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

Ответ 7

Клинт,

Вы можете писать код для обновления, хотя кажется, что для обновления записи на основе собственных полей не поддерживается.

В таком случае я сделал следующее и выполнил его на сервере:

------------------------------
records = Patient.all()

records.each do |p|
  encounters = p.encounters
  if encounters.nil? || encounters.empty?
    mra = p.updated_at
    #puts "\tpatient...#{mra}"
  else
    mra = encounters.last.created_at
    #puts "\tencounter...#{mra}"
  end
  old = p.most_recent_activity
  p.most_recent_activity = mra
  p.save!
  puts "#{p.last_name} mra: #{old} now: #{mra}"
end
------------------------------

Ответ 8

Бьюсь об заклад, вы можете подключиться к Activerecord:: Miration для автоматизации и отслеживания сценариев миграции.

Ответ 9

MongoDB - это база данных без схемы. Вот почему нет миграции. В самой базе данных не имеет значения, имеют ли объекты ключ: some_key или ключ: some_other_key в любое время.

MongoMapper пытается ввести в действие некоторые ограничения на это, но поскольку база данных настолько гибкая, вам придется самостоятельно поддерживать эти ограничения. Если вам нужен ключ для каждого объекта, убедитесь, что вы запустили script для обновления этих ключей на ранее существовавших объектах или обработали случай объекта, у которого нет этого ключа, когда вы сталкиваетесь с ним.

Я новичок в MongoDB самостоятельно, но, насколько я вижу, из-за гибкости без схемы, db, это то, как вам нужно будет обрабатывать его.