25

您如何使用 Meteor 执行数据库迁移?有了 Ruby on Rails,就有了 ActiveRecord::Migration。Meteor 中是否有等效机制?

例如,我用一些用户数据制作了一个应用程序。我使用 JSON 格式将数据存储在 Mongo 中。应用程序发生更改,JSON 数据库架构也需要更改。我可以编写一个迁移方法来更改架构,但是,我只希望它在服务器数据库过时时运行。

4

3 回答 3

36

没有为此内置任何内容。我自己现在所做的与 Rails 的工作方式类似,但作为启动的一部分而不是单独的任务。首先创建一个Meteor.Collection名为 Migrations,然后为每个离散的迁移,server在启动时运行的子目录下创建一个函数。它应该只在之前没有运行过的情况下运行迁移,并且一旦完成,它应该在 Migrations 集合中标记迁移。

// database migrations
Migrations = new Meteor.Collection('migrations');

Meteor.startup(function () {
  if (!Migrations.findOne({name: "addFullName"})) {
    Users.find().forEach(function (user) {
      Users.update(user._id, {$set: {fullname: users.firstname + ' ' + users.lastname}});
    });
    Migrations.insert({name: "addFullName"});
  }
});

您可以扩展此技术以支持向下迁移(查找给定迁移的存在并将其反转),对迁移强制执行排序顺序,并根据需要将每个迁移拆分为单独的文件。

考虑一个自动化的智能包会很有趣。

于 2012-04-28T19:34:20.290 回答
6

正如 Aram 在评论中已经指出的那样, p ercolate:migrations包可以满足您的需求。样本

Migrations.add({
    version: 1,
    name: 'Adds pants to some people in the db.',
    up: function() {//code to migrate up to version 1}
    down: function() {//code to migrate down to version 0}
});

Migrations.add({
    version: 2,
    name: 'Adds a hat to all people in the db who are wearing pants.',
    up: function() {//code to migrate up to version 2}
    down: function() {//code to migrate down to version 1}
});
于 2015-12-09T08:12:25.887 回答
5

我为这个用例创建了一个智能包。
https://atmosphere.meteor.com/package/migrations

于 2013-11-19T22:18:41.460 回答