WHI*_*LOR 20 mongoose mongodb node.js
我使用mongodb + node.js + mongoose.js ORM后端.
假设II有一些没有_id字段的嵌套对象数组
mongoose.Schema({
nested: [{
_id: false, prop: 'string'
}]
})
Run Code Online (Sandbox Code Playgroud)
然后我想将_id字段广告到所有嵌套的对象,因此mongoose模式将是
mongoose.Schema({
nested: [{
prop: 'string'
}]
})
Run Code Online (Sandbox Code Playgroud)
然后我应该运行一些脚本来修改生产数据库,对吗?处理此类变更的最佳方法是什么?哪种工具(或方法)最适合用于实施变更?
Ali*_*man 12
无模式数据库的一个显着优势是您不必使用新的模式布局更新整个数据库.如果数据库中的某些文档没有特定信息,那么您的代码可以执行相应的操作,或者选择现在对该记录执行任何操作.
另一种选择是根据需要懒洋洋地更新文档 - 只有在再次查看它们时.在这种情况下,您可能会选择具有每个记录/文档版本标记 - 最初可能不会出现(因此表示'版本0').即使这是可选的.相反,您的数据库访问代码会查找它需要的数据,如果它不存在,因为它是在代码更新后添加的新信息,那么它将尽可能地填充结果.
对于您的示例,将代码转换_id:false为标准MongoId字段,在读取代码(或在更新后写回),并且_id:false当前已设置,然后进行更改并仅在绝对需要时进行编写.
Mic*_*kov 10
您确实必须编写将遍历集合的脚本并为每个文档添加新字段.但是,如何执行此操作取决于数据库的大小和存储系统的性能.向文档添加字段将改变其大小,从而在大多数情况下导致重定位.此操作对IO有影响,并且也受其限制.如果你的集合只有几千个文档,可能高达十万个,那么你可以在一个循环中迭代它,因为整个集合可能适合内存,所有IO都会在之后发生.但是,如果集合跨越可用内存,则该方法更复杂.我们通常遵循MongoDB的生产使用的后续步骤:
文件块大小和睡眠时间必须通过实验确定.通常,您希望在迁移期间避免使用mongostats中的QR/QW.对于较慢驱动器上的较大集合(如亚马逊上的EBS),这种IO安全方法可能需要数小时到数天.
| 归档时间: |
|
| 查看次数: |
11068 次 |
| 最近记录: |