我正在构建一个Rails应用程序,使用MongoDB作为后端,MongoMapper作为ORM工具.假设在版本1中,我定义了以下模型:

class SomeModel
  include MongoMapper::Document
  key :some_key, String
end

在第2版的后面,我意识到我需要一个新的模型所需的密钥.因此,在版本2中,SomeModel现在看起来像这样:

class SomeModel
  include MongoMapper::Document
  key :some_key, String
  key :some_new_key, String, :required => true
end

如何迁移所有现有数据以包含一些新密钥?假设我知道如何为所有现有文档设置合理的默认值.更进一步,假设在版本3中,我意识到我真的不需要一些密钥.所以,现在模型看起来是这样的

class SomeModel
  include MongoMapper::Document
  key :some_new_key, String, :required => true
end

但我数据库中的所有现有记录都为某个_键设置了值,这只是在浪费空间.我该如何回收那个空间?

With ActiveRecord, I would have just created migrations to add the initial values of some_new_key (in the version1 -> version2 migration) and to delete the values for some_key (in the version2 -> version3 migration).

使用MongoDB/MongoMapper的合适方式是什么?在我看来,某种跟踪已运行迁移的方法仍然是必要的.这样的事情存在吗?

编辑:我认为人们忽视了我问题的重点.有时,您希望能够在数据库上运行脚本来更改或重组其中的数据.我在上面给出了两个例子,一个是添加了新的必需密钥,另一个是可以删除密钥并回收空间.您如何管理运行这些脚本?ActiveRecord迁移为您提供了一种简单的方法来运行这些脚本,并确定哪些脚本已经运行,哪些脚本还没有运行.很明显,我可以编写一个Mongo脚本来对数据库进行任何更新,但我想要的是一个类似迁移的框架,它可以让我跟踪哪些升级脚本已经运行.

推荐答案

看看Mongrations...我刚读完这本书,看起来像是你想要的.

http://terrbear.org/?p=249

http://github.com/terrbear/mongrations

干杯卡普斯洛克

Mongodb相关问答推荐

如何将数组$拉到对象数组下

匹配/筛选/投影对象中数组中数组中的嵌套字段

MongoDB聚合$group阶段$top与$first在大型数据集上的效率

在数组对象 Mongodb 中仅 Select 需要的数组

聚合管道可以用于更新数据库中的文档吗?

Golang 无法在 MongoDB 中创建文档

如何为具有相同名称的嵌套字段创建文本索引

Mongodb按值分组并计算出现次数

MongoDB:使用数组过滤器进行更新插入

如何在 MongoDb 中进行类似于嵌套 Sql Select 查询的嵌套查询

MongoDB插入引发重复键错误

将 JSON 与 MongoDB 一起使用?

有没有办法自动更新 MongoDB 中的两个集合?

在 MongoDB 中插入或更新许多文档

指定在 mongodb .js 脚本中使用哪个数据库

MongoDB - Permission denied for socket: /tmp/mongodb-27017.sock

MongoDB mongoexport 查询

将新值推送到 mongodb 内部数组 - mongodb/php

mongoose — 判断 ObjectId 是否存在于数组中

哪个数据库适合我的应用程序 mysql 或 mongodb ?使用 Node.js 、 Backbone 、 Now.js