【问题标题】:How to handle changes to db in meteor/mongo?如何处理流星/蒙戈中对数据库的更改?
【发布时间】:2013-09-27 04:51:40
【问题描述】:

我刚接触 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 的原因。我需要在这里重新考虑我的方法并学习。

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

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

【问题讨论】:

标签: mongodb meteor


【解决方案1】:

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

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

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

MongoDB 也是无模式。 这意味着您可以在数据中使用所需的任何字段。如果需要,这取决于您(程序员)来强制执行特定的约束。换句话说,mongo 方面没有逻辑。它应该接受你扔给它的任何数据,就像 Hubert OG 演示的那样。您的代码 sn-p 可能是:

// 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) 函数。

【讨论】:

  • 你说得对,mongo 它不是关系型的。但这并不是因为数据不相关,您可以在数据中包含您想要的任何字段;这是因为它没有架构。
  • @Dave 谢谢:你的评论让我很感动。我发现原因是模式是动态的。 mongodb.com/nosql如果你同意,我会编辑帖子。
  • 无模式、动态模式,几乎与 IMO 相同。
  • 我认为你是对的。不过,我更喜欢“动态”所传达的含义。但它似乎很少使用。 (更新了帖子并为您投票)
【解决方案2】:

Mongo 中没有迁移——没有方案!如果您想添加以前不存在的新字段,只需执行此操作即可。您甚至可以在同一个集合中拥有完全不同的文档!

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

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

 


 

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

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2018-05-18
    • 2023-03-30
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多