Миграции MongoDB

В этой статье хочу поделиться своим опытом создания миграций для mongo.

Миграция — это изменение состояния базы данных. Описанным в статье способом можно менять коллекции, добавлять поля, изменять поля, инициализировать коллекции начальными данными и так далее. Файлы с миграциями обычно кладутся под контроль версий и каждый разработчик может видеть что конкретно делает та или иная миграция.

Подразумевается что проекте используется node.js. Чтобы мигрировать базу данных я использую npm пакет под названием migrate-mongo .Чтобы им воспользоваться естественно нужно его поставить:

Для примера создам коллекцию видеоигр «games» , инициализирую её какими то дефолтными значениями, затем покажу как добавлять и изменять поля. Пусть для начала у каждой игры будет название и год выпуска.

Создание миграции

Для того чтобы пакет работал для него необходимо создать конфиг, в котором указать необходимые для исполнения параметры. Сначала создадим директорию в которой будут лежать написанные миграции:

После чего переходим во вновь созданную папку и выполняем команду:

После чего в папке создастся файл-конфиг.

В нем нужно указать урл вашей mongo db. После чего можно переходить к созданию коллекций.

В package.json в секцию «scripts» добавляем строчку:

Это позволит управлять миграциями с помощью npm.

Создаём миграцию с помощью команды:

Если всё получилось, то в терминал выведется следующее сообщение:

Название миграции делится на 2 части. В первой — время создания миграции, оно нужно чтобы миграции выполнялись в правильном порядке. Во второй части — название миграции.

Итак, сама миграция:

Как видно из кода, миграция содержит всего 2 метода — up и down. Первый срабатывает при запуске миграции, второй при её отмене. Отдельно хочется сказать про validator. Это встроенный механизм MongoDb для проверки типа вставляемого значения. В миграции указано что поле _id должно быть бинарным, поле name строкой, а поле year — датой. Если попытаться вставить в коллекцию объект с отличающимися от этих типов полями, то получим ошибку.

Чтобы запустить миграцию пишем в терминале:

Если все прошло успешно, то получим сообщение:

После этого коллеция повится в mongo и с ней можно будет работать. Для того чтобы отменить миграцию(выполнить метод down) пишем:

После чего коллекция удалится.

Бывают случаи когда коллекцию нужно расширить или изменить, это тоже делается через миграцию. Например, можно добавить в коллекцию игр компанию-идателя. Создаем новую миграцию:

Код миграции:

Как видно из кода мы модифицируем коллекцию games и заменяем её validator, в который добавилось поле publisher. Обычно при добавлении  поля нужно проинициализировать его каким то значением, но сейчас я это опущу.

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

Также можно почитать: