随着应用程序的发展,更新/迁移Mongoose模式的最佳实践(或工具)是什么?
Answers:
更新:经过测试,这不能以当前的形式运行,它的想法正确,我只需要一次迁移就可以对模块本身进行相当大的调整。但是,我认为如果不进行一些重大更改并以某种方式跟踪不同的模式,它就不会按预期工作。
听起来像您想要猫鼬数据迁移
它旨在在使用旧版本的文档时迁移它们,这似乎是在mongodb中处理迁移的最佳方法。
您实际上并不想在文档集合(ala alter table)上运行完整的数据集迁移,因为这会给服务器带来沉重的负担,并且可能需要应用程序/服务器停机。有时您可能需要编写一个脚本,该脚本简单地抓取所有应用新模式/更改并调用保存的文档,但是您需要了解何时/何地执行此操作。一个例子可能是,将迁移逻辑添加到doc init中比将服务器停机3个小时来运行迁移脚本具有更大的性能损失。
我发现此链接也很有帮助,基本上更详细地重申了上述内容,并且基本上在php中实现了上述节点包的概念。
注意:该模块已有5个月的历史,使用了0个分叉,但正在环顾四周,无法找到比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()函数将基于过滤器更新集合中的所有文档。在这种情况下,过滤器将查找“出生地”字段为null的所有文档。然后,在那些名为“出生地”的文档中设置一个新字段,并将其值设置为“ neverborn”。
运行代码后,进行修改以反映您的运行情况:
db.<collection>.find().pretty()
验证所做的更改。集合中每个文档的末尾都应显示新字段“出生地”,其值为“ neverborn”。
希望能有所帮助。