处理Mongoose中的模式更改

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

更新:经过testing,这不符合目前的forms,它有正确的想法,我得到了一个单一的迁移工作与模块本身的相当大的调整。 但是我没有看到它在没有发生重大变化的情况下按预期工作,也不知道如何跟踪不同的模式。


听起来就像你想要mongoose数据迁移

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

您不希望在文档集合(ala alter table)上运行完整的数据集迁移,因为它会给您的服务器带来沉重的负担,并且可能需要应用程序/服务器停机时间。 有时你可能需要写一个简单的抓取所有文档的脚本来应用新的模式/修改和调用保存,但是你需要了解何时/在哪里做。 一个例子可能是,向doc init添加迁移逻辑比运行迁移脚本运行3小时的服务器性能要好。

我发现这个链接也很有帮助,基本上重申了上面的更多细节,并基本上实现了上述节点包的概念在PHP中。

NB模块是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()函数将根据filter更新集合中的所有文档。 在这种情况下,filter正在查找字段“出生地”为空的所有文档。 然后在那些名为“出生地”的文件中设置一个新的领域,并将其价值设定为“永生”。

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

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

validation所做的更改。 具有“永生”价值的新领域“出生地”应显示在您collections的每个文件的末尾。

希望有所帮助。