【问题标题】:Dealing with schema changes in Mongoose处理 Mongoose 中的模式更改
【发布时间】:2011-11-28 20:11:58
【问题描述】:

随着应用程序的发展,更新/迁移 Mongoose 架构的最佳做法(或工具)是什么?

【问题讨论】:

    标签: mongodb data-migration mongoose


    【解决方案1】:

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

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

    到:

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

    【讨论】:

    • 我真的在考虑像 Rails 的迁移这样的工具,它可以让你处理变更管理方面,但我不认为真的有类似的东西,所以我会接受这个。跨度>
    • 我不认为它与 SQL 数据库有什么不同。例如,您可能会将“名称”拆分为“名字”和“姓氏”字段……您必须针对每个环境的数据库运行该转换并以某种方式对其进行跟踪。
    • 您不必“迁移”架构(好吧,在没有实际架构的情况下,您可能仍会迁移索引等),但您确实有迁移实际数据。
    • 您正在尝试修复历史记录。您应该改用插件。
    • 好吧,我也有我,因为我还没有这种情况,但是我有一个非常大的架构,我知道随着时间的推移需要改变,所以我如何访问项目在以前版本的架构中创建的集合?猫鼬有魔法吗?
    【解决方案2】:

    我刚刚遇到了这个问题,我需要更新我的数据库以反映对我的架构所做的更改。经过一番研究,我决定尝试在 mongo 控制台中使用 updateMany() 函数进行更新,我认为它运行良好。

    要将其应用于 vimdude 的示例,代码如下所示:

    try { 
        db.<collection>.updateMany( { birthplace: null }, { $set: 
                  {"birthplace": "neverborn" } } ); 
    } catch(e) { 
        print(e);
    }
    

    updateMany() 函数将根据过滤器更新集合中的所有文档。在这种情况下,过滤器将查找字段“birthplace”为空的所有文档。然后在这些文档中设置一个名为“birthplace”的新字段,并将其值设置为“neverborn”。

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

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

    验证是否进行了更改。值为“neverborn”的新字段“birthplace”应显示在集合中每个文档的末尾。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      更新:经过测试,这在当前形式下不起作用,它的想法是正确的,我进行了一次迁移以对模块本身进行大量调整。但是如果没有一些重大更改并以某种方式跟踪不同的模式,我认为它不会按预期工作。


      听起来你想要猫鼬数据迁移

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

      您真的不想在文档集合(ala alter table)上运行完整的数据集迁移,因为它会给您的服务器带来沉重的负载,并且可能需要应用程序/服务器停机。有时您可能需要编写一个简单地抓取所有文档的脚本,应用新模式/更改并调用保存,但您需要了解何时/何地执行此操作。例如,将迁移逻辑添加到 doc init 比关闭服务器 3 小时来运行迁移脚本对性能的影响更大。

      我发现这个link 也很有帮助,基本上更详细地重申了上述内容,并且基本上在 php 中实现了上述节点包的概念。

      注意该模块已有 5 个月大,0 个分叉,但我环顾四周,找不到比 abdelsaid 的回复风格更好/更有帮助的东西。..

      【讨论】:

      • 已更新。可悲的是它相当破碎。如果您找到任何东西,请在这里告诉我,有点想要一个合适的解决方案来进行更新方法。我有一种感觉,您需要跟踪每个版本才能加载较旧的模式并允许像模块尝试那样进行修改。唉,到目前为止我的猫鼬知识还很缺乏。到达那里!
      猜你喜欢
      • 2011-11-25
      • 2011-12-11
      • 2015-06-17
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多