如何在meteor / mongo中处理db的更改?

时间:2013-09-22 02:55:56

标签: mongodb meteor

我对Meteor和Mongo有几个小时的新手,来自Rails背景并试图了解迁移是如何工作的 - 或者不是吗?

我有一个server/bootstrap.js文件,我用它来播种一些数据:

// if the database is empty on server start, create some sample data.
Meteor.startup(function () {
  if (Users.find().count() === 0) {
    var userData = [
        { name: 'Cool guy' },
        { name: 'Other dude' }
    ];

    for (var i = 0; userData.length; i++) {
      var userId = Users.insert({
        name: userData[i].name
      });
    }
  }
});

似乎每次我想要更改数据库时,比如添加一个新字段,我必须运行meteor reset才能让它获取更改。

但是,如果我通过UI创建记录或其他数据,我会想要保留什么?在使用MySQL或PostgreSQL的Rails中,我创建了一个迁移来创建新字段而不会吹走整个数据库。

这如何与Meteor和Mongo一起使用?还考虑了从开发到生产的新变化的案例。谢谢!

- 更新:2013/09/24 -

显然,Mongo的无模式特性减少或消除了迁移的需要。在我的情况下,由于用户计数检查,修改userData以添加新字段在最初运行后将无效 - 这就是我继续运行meteor reset的原因。我需要在这里重新思考我的方法并进行研究。

也就是说,有些项目使用迁移,例如望远镜:https://github.com/SachaG/Telescope/blob/master/server/migrations.js

我还发现http://try.mongodb.org/的教程非常有用。

2 个答案:

答案 0 :(得分:1)

Mongo没有迁移 - 没有计划!如果你想添加一个以前不存在的新字段,那就去做吧。您甚至可以在同一个集合中拥有完全不同的文档!

Items.insert({name: "keyboard", type: "input", interface: "usb"});
Items.insert({cherries: true, count: 5, unit: "buckets", taste: "awesome"});

这将起作用。使用NoSQL的主要原因之一(以及Meteor over Rails的优点)是您无需担心迁移。


使用mrt reset更改数据库模型是个糟糕的主意。它实际上做的是完全重置数据库 - 它会删除所有数据!虽然有时在开发中很有用,但我敢打赌,在这种情况下,这不是你想要的。

答案 1 :(得分:1)

首先,您的代码完全有效。你知道的。

mrt reset为您提供了一个“新鲜”的空数据库(如上所述)。 如果要重置特定集合,可以这样做: MyCollection.remove({});

但你必须了解NoSQL的本质:对数据没有任何限制。它可以被称为NoREL(不是关系数据库,源:Wikipedia)。

MongoDB也架构。 这意味着您可以在数据中使用所需的任何字段。如果您需要某些约束,这取决于您(程序员)执行特定约束。换句话说, mongo方面没有逻辑。它应该接受你抛出的任何数据,就像Hubert OG所展示的那样。您的代码段可能是:

// if the database is empty on server start, create some sample data.
Meteor.startup(function () {
   if (Users.find().count() === 0) {
    var userData = [
      { name: 'Cool guy' },
      { name: 'Other dude' },
      { nickname: 'Yet another dude' }           // this line shows that mongo takes what you throw him
    ];

    for (var i = 0; userData.length; i++) {
      var userId = Users.insert({
        name: userData[i].name
      });
    }
  }
});

来源:http://www.mongodb.com/nosql

那里没有必要迁移。您只需在应用程序代码中添加逻辑。

注意:要导入/导出数据库,您可以查看:mongo import/export doc,也许可以使用db.copyDatabase(origin, destination, hostname)函数。