处理Mongoose中的架构更改

mah*_*off 70 data-migration mongoose mongodb

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

vim*_*ude 36

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

new Schema({
    name: { type: string }
})
Run Code Online (Sandbox Code Playgroud)

至:

new Schema({
    name: { type: string },
    birthplace: { type: string, required: true, default: 'neverborn' }
});
Run Code Online (Sandbox Code Playgroud)

  • 您不必"迁移"架构(在没有实际架构的情况下,您可能仍会迁移索引等),但是您必须*迁移实际数据. (15认同)
  • 我不认为它与SQL数据库有如此不同.例如,您可能将"name"拆分为"firstname"和"surname"字段......您必须针对每个环境的数据库运行该转换并以某种方式跟踪它. (3认同)
  • 好吧,我也有我,因为我还没有这种情况,但我有一个非常大的架构,我知道需要随着时间的推移而改变,所以我如何访问在以前创建的集合中的项目架构的版本?猫鼬有魔力吗? (3认同)
  • 你正试图修复历史.你应该使用插件. (2认同)

Aar*_*ton 6

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

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

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

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

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

db.<collection>.find().pretty()
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.


Lou*_*uis 5

更新:经过测试,这不能以其当前形式运行,它有正确的想法,我只需要对模块本身进行大量调整即可完成一次迁移.但是,如果没有一些重大变化并且以某种方式跟踪不同的模式,我不认为它按预期工作.


听起来你想要mongoose-data-migrations

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

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

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

NB该模块是5个月,0叉,但我环顾四周,找不到比abdelsaid的响应风格更好/更有帮助的东西..