部署 使用 Mongodb 的亲,部署时你怎么做 migration 呀?

6233843 · 2014年04月20日 · 最后由 xds2000 回复于 2014年05月09日 · 3779 次阅读

原来使用 mysql+active record,capistrano 部署时轻轻松松搞定 migration。现在尝试 mongodb 了,不知道还是像原来一样生成 migration 文件,用 capistrano 部署时进行 migration 么?大家的 mongodb migration 都怎么做的?

@6233843 mongodb 没有 schema,没有 migratjion 的概念吧

mongodb 不用迁移,插入数据自动生成 collection。

migration? mongo 不用 migration 啊 在 class 里面直接写表的字段

谢谢@ailen @pynix @neverlandxy_naix的回复,怪我没有说清楚,我的问题应该是在系统已经上线的情况下,如何处理对已有 collection 中字段的更改问题?因为增删列很简单,修改现有列比较麻烦。还有就是运行 migration 修改数据的时机,之前都是由 capistrano 自己控制的,我只是简单调用 deploy:migrations 而已。

gem 'mongoid_rails_migrations'

#5 楼 @aptx4869 不知道你用过 mongoid_rails_migrations 么?有什么样的心得?

@6233843 我的做法是写专门的 migrate 脚本对数据进行升级。注意当单 collection 超过 100M 时,应该使用原生的 mongodb api 操作,这样效率更快一点。我是 dump 本地一份,写完测试可用性,然后在到 stage,prod 环境。

例子:

https://github.com/onepiecejs/nodejs-cantas/blob/master/scripts/db_migration_card_add_boardId.js

#7 楼 @xds2000 感谢回复,在 prod 运行脚本的时候,是不是在代码里面写 if/else,同时支持更新之前和更新之后的数据,然后再运行脚本修改数据库?

汗 用 Mongodb 为的不就是不用写 Migration 和担心 schema 吗?

另外接口定义实在 model 里面写的,你哪个 Model 的哪个字段改名字里在这里改,这是 mongoid 的,你用其他的可以去看说明

@6233843 不需要 if/else,你的迁移过程应该一次性的完成数据库和代码级别的更新。

#10 楼 @xds2000 如何做成一次性的数据库和代码更新,难道要停服务器么?否则怎么处理在更新数据库时,用户依然访问?

#9 楼 @karmue 举个例子,之前有一列存储的是 0 或 1,现在要改成 true 和 false,请问如果是你的话觉得该怎么做?

MongoDB 的特点就是免 migration,只管插数据就行。

@6233843 把网站跳到维护状态,然后把线上 DB 下线,然后更新,测试通过后然后上线。不停机的更新有其他办法,你需要 Google 一下,这里不在赘述。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号