Обработка миграций с MongoDb - PullRequest
       18

Обработка миграций с MongoDb

14 голосов
/ 17 февраля 2012

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

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

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 мы обычно имеем сценарий миграции, который запускается как часть сценария сборки, который изменяет схему и обновляет / вставляет / удаляет любые дополнительные данные для этой дельты.

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

Любой совет по этому вопросу был бы великолепен

=== Редактировать ===

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

Ответы [ 3 ]

14 голосов
/ 17 февраля 2012

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

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

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

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

3 голосов
/ 17 февраля 2012

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

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

  1. Отправка на сервер сборкиприложение в «Режим чтения», так что любой может читать, но не может ничего вставить в базу данных.
  2. Пока Prod в режиме чтения, я беру базу данных и применяю патч.
  3. После внесения исправлений резервное копирование базы данных, остановка веб-сервера, развертывание новой базы данных и нового приложения.

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

1 голос
/ 30 июня 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...