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

Mongodb 如何处理meteor/mongo中对db的更改?,mongodb,meteor,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 = [ {

我是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创建记录或其他我想要保留的数据,会发生什么呢?在Rails中,使用MySQL或PostgreSQL,我会创建一个迁移来创建新字段,而不会破坏整个数据库

Meteor和Mongo是如何工作的?还考虑到从开发到生产的新变化。谢谢

--更新:2013/09/24--

显然,Mongo的无模式特性减少或消除了迁移的需要。在我的例子中,修改
userData
以添加新字段在最初运行后不会起作用,因为用户计数检查-这就是为什么我一直运行
meteor reset
。我需要在这里重新思考我的方法,并进一步研究

也就是说,有些项目使用迁移,比如望远镜:


我还发现这个教程非常有用

Mongo中没有迁移-没有方案!如果您想添加一个以前没有的新字段,只需这样做,它就会工作。您甚至可以在同一个集合中拥有完全不同的文档

Items.insert({name: "keyboard", type: "input", interface: "usb"});
Items.insert({cherries: true, count: 5, unit: "buckets", taste: "awesome"});
这就行了。使用NoSQL(Meteor优于Rails)的一个主要原因是您不必担心迁移



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

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

mrt reset
为您提供了一个“新”空数据库(如前所述)。 如果要重置特定集合,可以执行以下操作:
MyCollection.remove({})

但您必须理解NoSQL的本质:数据没有约束。它可以称为NoREL(在非关系数据库中,源:)

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
      });
    }
  }
});
资料来源:

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


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

可能重复:您说mongo它不是关系数据库是对的。但这并不是因为数据不是关系型的,你可以在你的数据中有你想要的任何字段;这是因为它没有模式。@Dave谢谢你:你的评论让我很挖苦。我发现原因是模式是动态的。如果你同意的话,我将编辑post.Schema-less,动态模式,在我看来几乎是一样的。我想你是对的。不过,我更喜欢“动态”所传达的含义。但它似乎很少使用。(更新了帖子并对你进行了投票)