随着应用程序的发展,更新/迁移 Mongoose 模式的最佳实践(或工具)是什么?
有趣的是 MongoDB 是为了应对 RDBMS 的模式问题而诞生的。您不需要迁移任何东西,只需要在模式定义中设置默认值(如果需要该字段)。
new Schema({ name: { type: string } })
致:
new Schema({ name: { type: string }, birthplace: { type: string, required: true, default: 'neverborn' } });
更新: 测试过了,这个模块在当前的形式下无法工作,它的想法是正确的,我只进行了一次迁移,并对模块本身进行了相当大的调整。但是,如果没有一些重大更改,并以某种方式跟踪不同的模式,我认为它不会按预期的方式工作。
听起来你想要猫鼬数据迁移
它的目的是在您使用文档时迁移旧的模式版本,这似乎是在 mongodb 中处理迁移的最佳方法。
您实际上并不希望在文档集合(ala alter table)上运行完整的数据集迁移,因为它会给服务器带来沉重的负载,并且可能需要应用程序/服务器停机。有时候,您可能需要编写一个脚本,简单地抓取应用新模式/修改和保存调用的所有文档,但是您需要了解何时/何地进行这项工作。一个例子可能是,将迁移逻辑添加到 doc init 比关闭服务器3个小时来运行迁移脚本对性能的影响更大。
我发现这个 链接也非常有帮助,基本上重申了上面的更多细节,并且基本上在 php 中实现了上面的节点包的概念。
注意: 这个模块已经用了5个月了,是0个叉子,但是我四处看了看,没有发现比阿卜杜勒 · 赛德的回答方式更有用的东西了。.
我只是遇到了这个问题,需要更新数据库以反映模式的变化。经过一些研究,我决定尝试 mongo 控制台中的 updateMany ()函数来进行更新,我认为它工作得非常好。
要将这个应用到 vimdud 的示例中,代码如下所示:
try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }
函数将基于筛选器更新集合中的所有文档。在这种情况下,过滤器将查找所有字段“ born place”为 null 的文档。然后在这些名为“出生地”的文档中设置一个新字段,并将其值设置为“从未出生”。
运行代码后,根据您的情况进行修改:
db.<collection>.find().pretty()
来验证更改是否已经完成。值为“ neverborn”的新字段“ born place”应该显示在集合中每个文档的末尾。
希望能帮上忙。