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

Обработка миграции с помощью MongoDb

Просто для того, чтобы дать немного больше контекста этому вопросу, у меня есть веб-приложение (asp mvc), которое в основном переносит операции CRUD на экземпляр MongoDb, оно выполняет проверку и определенную бизнес-логику до того, как модель будет проверена и отправлена сохраняться, извлекаться и т.д.

Теперь у нас есть одна проблема: в новой версии модели изменились, но существующих данных нет, вот пример: (это конкретный С#, но вопрос действительно является агностиком языка)

public class Person
{
    public Guid Id {get; set;}
    public string Name {get; set;}
    public int Age {get;set;}
    public string BadgeNo {get;set;}
}

public class Person
{
    public Guid Id {get; set;}
    public string Name {get; set;}
    public int Age {get;set;}
    public string EmployeeNo {get; set;} // Still contains same data as BadgeNo just called something different
}

Как вы можете видеть, структура объектов изменилась, но на земле Монго она по-прежнему выдает BadgeNo, а не EmployeeNo. На земле SQL мы обычно имеем миграцию script, которая запускается как часть сборки script, которая будет изменять схему и обновлять/вставлять/удалять любые дополнительные данные для этой дельта.

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

Любые советы по этому вопросу были бы замечательными

=== Изменить ===

Кажется, что в настоящее время я желаю перейти с вариантом миграции, а не с постепенным откатом, поэтому, имея в виду, кто-нибудь может рекомендовать какие-либо инструменты для помощи в этой области, так как в противном случае каждая миграция (при условии, развертывание) должно было быть предварительно скомпилированной сборкой какого-то рода со всей логикой. Я думал о чем-то вроде FluentMigrator, но вместо того, чтобы работать с SQL, вы работаете с Mongo. В настоящее время мои скрипты сборки используют Nant, я видел некоторые рубиновые инструменты, но не уверен, есть ли какой-либо эквивалент .net.

4b9b3361

Ответ 1

В основном существуют два подхода:

  • Убедитесь, что ваш код приложения может обрабатывать как "версии" структуры данных, так и при сохранении, обновлении новой структуры
  • Запись миграции script

Я бы, вероятно, пошел на вариант 1, поскольку это метод, который позволяет вам постепенно обновлять, где, как и в случае с вариантом 2, вам в основном нужно удалить приложение, чтобы вы могли обновлять код (быстро) и данные (возможно, медленнее) за один раз.

Затем позже, или если вам будет необходимо сделать вариант 2, а также перенести данные. Это значит, что вам не нужно удалять свой сайт и можете с радостью работать в фоновом режиме асинхронно.

Ответ 2

Стратегии могут быть разными. И они зависят от конкретного приложения. Конечно, для таких сайтов, как Facebook, вы поедете с опцией №1, предложенной Дериком, чтобы не поражать своих пользователей, но если у вас есть сайт, который "продает пиццу", вы наверняка не хотите прилагать усилия для поддержки обеих версий ( текущий и новый), напишите более сложный код и т.д.

Для такого рода приложений простое исправление может быть лучшим вариантом:

  • Создайте сервер, отправляющий приложение в режим чтения, так что любой может читать, но не может вставлять что-либо в базу данных.
  • Пока prod в режиме чтения я беру базу данных и применяю патч.
  • После исправления сделайте резервную копию базы данных, остановите веб-сервер, разверните новую базу данных и новое приложение.

Отправка приложения в режим чтения позволяет сократить время простоя, но опять же для сайтов, которые продают пиццу, вам не нужен режим чтения.

Ответ 3

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

Для тех, кто все еще ищет решение, посмотрите MongoMigrations, этот инструмент предоставляет MongoDatabase (из драйвера mongo csharp ) для манипуляций с базой данных, чтобы вы могли использовать все функции из драйвера.