it-swarm.com.ru

Работа с изменениями схемы в Mongoose

Каков наилучший метод (или инструмент) для обновления/переноса схем Mongoose по мере развития приложения?

69
mahemoff

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


Похоже, вы хотите миграции данных мангуста

Он предназначен для переноса старых версий схемы ваших документов по мере их использования, что, по-видимому, является наилучшим способом обработки миграций в mongodb.

На самом деле вы не хотите запускать полную миграцию набора данных в коллекции документов (ala alter table), так как это создает большую нагрузку на ваши серверы и может потребовать простоя приложения/сервера. Иногда вам может понадобиться написать скрипт, который просто захватывает все документы, применяет новую схему/изменения и сохраняет вызовы, но вам необходимо понять, когда и где это сделать. Примером может быть то, что добавление логики миграции в doc init приводит к большему снижению производительности, чем стоит остановка сервера на 3 часа для запуска сценариев миграции.

Я нашел это ссылка также довольно полезным, в основном повторяет вышеупомянутое более подробно и по существу реализует концепцию вышеупомянутого пакета узла в php.

N.B. Модулю 5 месяцев, 0 вилок, но я осматриваюсь и не могу найти ничего лучше/полезнее, чем стиль ответа abdelsaid.

5
Louis

Забавно, что MongoDB родился для того, чтобы отвечать на проблемы со схемами в RDBMS. Вам не нужно ничего переносить, все, что вам нужно сделать, это установить значение по умолчанию в определении схемы, если поле является обязательным.

new Schema({
    name: { type: string }
})

чтобы:

new Schema({
    name: { type: string },
    birthplace: { type: string, required: true, default: 'neverborn' }
});
36
vimdude

У меня была эта проблема, когда мне нужно было обновить базу данных, чтобы отразить изменения в моей схеме. После некоторых исследований я решил попробовать функцию updateMany () в консоли mongo, чтобы сделать обновления, и я думаю, что она работала довольно хорошо.

Чтобы применить это к примеру vimdude, код должен выглядеть следующим образом:

try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }

Функция updateMany () обновит все документы в коллекции на основе фильтра. В этом случае фильтр ищет все документы, у которых поле 'место рождения' равно нулю. Затем он устанавливает новое поле в этих документах с именем "место рождения" и устанавливает его значение "никогда не рождаться".

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

db.<collection>.find().pretty()

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

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

6
Aaron Pennington