首页 文章

处理Mongoose中的架构更改

提问于
浏览
69

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

3 回答

  • 36

    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'的风格的回应..

  • 6

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

    new Schema({
        name: { type: string }
    })
    

    至:

    new Schema({
        name: { type: string },
        birthplace: { type: string, required: true, default: 'neverborn' }
    });
    
  • 5

    我只是遇到了这个问题,我需要更新我的数据库以反映我的架构的更改 . 经过一番研究后,我决定尝试在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 的新字段“出生地”应显示在您的集合中每个文档的末尾 .

    希望有所帮助 .

相关问题