随着应用程序的发展,更新/迁移Mongoose模式的最佳实践(或工具)是什么?
Update: 经过测试,这不能以其当前的形式运行,它有正确的想法,我有一个单独的迁移工作与模块本身的相当大的调整 . 但是,如果没有一些重大变化并且以某种方式跟踪不同的模式,我不认为它按预期工作 .
听起来你想要mongoose-data-migrations
它旨在在您使用文档时迁移文档的旧模式版本,这似乎是处理mongodb中迁移的最佳方法 .
您并不真的希望在文档集合(ala alter table)上运行完整的数据集迁移,因为它会给您的服务器带来沉重的负担,并且可能需要应用程序/服务器停机 . 有时您可能需要编写一个脚本,它只是抓取所有文档应用新的架构/更改和调用save,但您需要了解何时/何地执行此操作 . 一个例子可能是,向doc init添加迁移逻辑比使服务器运行3小时以运行迁移脚本更具有性能损失 .
我发现这个link也非常有用,基本上更详细地重申了上述内容,并基本上在php中实现了上述节点包的概念 .
N.B. 模块是5个月,0叉,但我环顾四周,可以't find anything better / more helpful than abdelsaid'的风格的回应..
虽然很有趣,MongoDB的诞生是为了响应RDBMS中的模式问题 . 您不必迁移任何内容,如果需要该字段,您只需在架构定义中设置默认值即可 .
new Schema({ name: { type: string } })
至:
new Schema({ name: { type: string }, birthplace: { type: string, required: true, default: 'neverborn' } });
我只是遇到了这个问题,我需要更新我的数据库以反映我的架构的更改 . 经过一番研究后,我决定尝试在mongo控制台中使用updateMany()函数进行更新,我认为它运行得很好 .
要将此应用于vimdude的示例,代码将如下所示:
try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }
updateMany()函数将基于过滤器更新集合中的所有文档 . 在这种情况下,过滤器正在查找字段“birthplace”为空的所有文档 . 然后,它在名为“birthplace”的文档中设置一个新字段,并将其值设置为“neverborn” .
运行代码后,修改以反映您的情况运行:
db.<collection>.find().pretty()
验证是否已进行更改 . 具有“从未出生” Value 的新字段“出生地”应显示在您的集合中每个文档的末尾 .
希望有所帮助 .
3 回答
Update: 经过测试,这不能以其当前的形式运行,它有正确的想法,我有一个单独的迁移工作与模块本身的相当大的调整 . 但是,如果没有一些重大变化并且以某种方式跟踪不同的模式,我不认为它按预期工作 .
听起来你想要mongoose-data-migrations
它旨在在您使用文档时迁移文档的旧模式版本,这似乎是处理mongodb中迁移的最佳方法 .
您并不真的希望在文档集合(ala alter table)上运行完整的数据集迁移,因为它会给您的服务器带来沉重的负担,并且可能需要应用程序/服务器停机 . 有时您可能需要编写一个脚本,它只是抓取所有文档应用新的架构/更改和调用save,但您需要了解何时/何地执行此操作 . 一个例子可能是,向doc init添加迁移逻辑比使服务器运行3小时以运行迁移脚本更具有性能损失 .
我发现这个link也非常有用,基本上更详细地重申了上述内容,并基本上在php中实现了上述节点包的概念 .
N.B. 模块是5个月,0叉,但我环顾四周,可以't find anything better / more helpful than abdelsaid'的风格的回应..
虽然很有趣,MongoDB的诞生是为了响应RDBMS中的模式问题 . 您不必迁移任何内容,如果需要该字段,您只需在架构定义中设置默认值即可 .
至:
我只是遇到了这个问题,我需要更新我的数据库以反映我的架构的更改 . 经过一番研究后,我决定尝试在mongo控制台中使用updateMany()函数进行更新,我认为它运行得很好 .
要将此应用于vimdude的示例,代码将如下所示:
updateMany()函数将基于过滤器更新集合中的所有文档 . 在这种情况下,过滤器正在查找字段“birthplace”为空的所有文档 . 然后,它在名为“birthplace”的文档中设置一个新字段,并将其值设置为“neverborn” .
运行代码后,修改以反映您的情况运行:
验证是否已进行更改 . 具有“从未出生” Value 的新字段“出生地”应显示在您的集合中每个文档的末尾 .
希望有所帮助 .