处理猫鼬中的架构更改


Answers:


5

更新:经过测试,这不能以当前的形式运行,它的想法正确,我只需要一次迁移就可以对模块本身进行相当大的调整。但是,我认为如果不进行一些重大更改并以某种方式跟踪不同的模式,它就不会按预期工作。


听起来像您想要猫鼬数据迁移

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

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

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

注意:该模块已有5个月的历史,使用了0个分叉,但正在环顾四周,无法找到比abdelsaid的回应风格更好/更有用的东西。


1
更新。可悲的是它相当破碎。如果您有任何发现,请在这里让我知道,有点想要一种合适的解决方案,当您进行更新。我有一种感觉,您需要跟踪每个版本才能加载较旧的架构,并允许进行类似模块尝试的修改。las,到目前为止,我的猫鼬知识还很少。到达那里!
2014年

37

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

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

至:

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

1
我确实在考虑诸如Rails的迁移之类的工具,该工具可以让您处理变更管理方面的问题,但是我认为确实没有类似的东西,因此我会接受。
mahemoff 2012年

4
我认为它与SQL数据库没有什么不同。例如,您可能会将“名称”拆分为“名字”和“姓”字段...您将不得不对每个环境的数据库运行该转换并以某种方式对其进行跟踪。
mahemoff 2012年

17
你不必“迁移”模式(有点好,你可能仍然迁移指数等在无实际架构),但你必须迁移的实际数据。
mahemoff 2012年

2
您正在尝试修复历史记录。您应该改用插件。
vimdude 2012年

3
好的,我也有我,因为我还没有这种情况,但是我有一个非常大的架构,我知道它会随着时间的流逝而改变,所以我该如何访问先前创建的集合中的项目模式的版本?猫鼬有魔术吗?
后悔

7

我只是遇到了这个问题,需要更新数据库以反映对架构的更改。经过研究后,我决定尝试在mongo控制台中使用updateMany()函数进行更新,我认为它的效果很好。

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

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

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

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

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

验证所做的更改。集合中每个文档的末尾都应显示新字段“出生地”,其值为“ neverborn”。

希望能有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.