处理Mongoose中的架构更改

时间:2011-09-30 23:19:40

标签: mongodb data-migration mongoose

随着应用程序的发展,更新/迁移Mongoose模式的最佳实践(或工具)是什么?

3 个答案:

答案 0 :(得分:36)

有趣的是,MongoDB的诞生是为了响应RDBMS中的模式问题。您不必迁移任何内容,如果需要该字段,您只需在架构定义中设置默认值。

new Schema({
    name: { type: string }
})

为:

new Schema({
    name: { type: string },
    birthplace: { type: string, required: true, default: 'neverborn' }
});

答案 1 :(得分:6)

我遇到了这个问题,我需要更新我的数据库以反映我的架构的更改。经过一些研究后,我决定尝试在mongo控制台中使用updateMany()函数进行更新,我认为它运行得很好。

要将此应用于vimdude的示例,代码如下所示:

try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }

updateMany()函数将根据过滤器更新集合中的所有文档。在这种情况下,过滤器正在查找字段“birthplace”为空的所有文档。然后,它在名为“birthplace”的文档中设置一个新字段,并将其值设置为“neverborn”。

运行代码后,修改以反映您的情况:

db.<collection>.find().pretty()

验证是否已进行更改。具有“从未出生”价值的新字段“出生地”应显示在您的集合中每个文档的末尾。

希望有所帮助。

答案 2 :(得分:5)

更新:经过测试,这在当前形式下无法正常工作,它有正确的想法,我通过大量调整模块本身进行了单次迁移。但是,如果没有一些重大变化并且以某种方式跟踪不同的模式,我不认为它按预期工作。


听起来像是想要mongoose-data-migrations

它旨在在您使用文档时迁移文档的旧模式版本,这似乎是处理mongodb中迁移的最佳方法。

您真的不想在文档集合(ala alter table)上运行完整的数据集迁移,因为它会给您的服务器带来沉重的负担,并且可能需要应用程序/服务器停机。有时您可能需要编写一个脚本,它只是抓取所有文档应用新的架构/更改和调用save,但您需要了解何时/何地执行此操作。一个例子可能是,向doc init添加迁移逻辑比使服务器运行3小时以运行迁移脚本更具有性能损失。

我发现这个link非常有用,基本上更详细地重申了上述内容,并基本上在php中实现了上述节点包的概念。

N.B。该模块是5个月,0分叉,但我正在环顾四周,找不到比abdelsaid的回复风格更好/更有帮助的东西..