python - django 和 mongodb 是否使迁移成为过去?

由于 mongo 没有架构,这是否意味着我们在更改模型时不必进行迁移?

非关系型数据库的迁移过程是什么样的?

最佳答案

我认为这是一个非常好的问题,但根据您使用的库和您对“迁移”的期望,答案会有些分散。

我们来看看一些常见的迁移操作:

  • 添加字段: Mongo 让这变得非常简单。只需添加一个字段即可。
  • 删除一个字段:理论上,您实际上并没有绑定(bind)到您的架构,所以这里的“删除”是相对的。如果您删除“属性”并且不再加载该字段,那么该字段是否在数据中并不重要。因此,如果您关心“清理”数据库,那么删除字段不会影响数据库。如果您确实关心清理数据库,则基本上需要对数据库运行一个巨大的 for 循环。
  • 修改字段名:这也是个难题。当您重命名字段“在哪里”时,您是在重命名它吗?如果您希望数据库反射(reflect)新的字段名称,那么您基本上必须在数据库上执行一个巨大的 for 循环。为了安全起见,您可能必须“添加”数据,然后推送代码,然后“取消设置”旧字段。

一些皱纹

但是,字段名称与 ActiveRecord 对象相结合的概念有点歪曲。 ActiveRecord 对象有效地提供了对象属性到实际数据库字段的映射。

在典型的 RDBMS 中,字段名称的“大小”并不真正相关。但是,在 Mongo 中,字段名称实际上占用了数据空间,这在性能方面有很大的不同。

现在,如果您使用某种形式的“数据对象”,例如 ActiveRecord,为什么要尝试在数据中存储完整的字段名称?数据库可能应该按字母顺序存储所有字段,并在对象端使用 map 。因此,一个文档可能有 8 个字段/属性,数据库名称将是“a”、“b”...“j”,但对象名称将是可读的东西,如“名称”、“价格”、“数量”。

我提出这个的原因是它给修改字段名称增加了另一个问题。如果您正在实现映射,那么修改字段名称根本不会真正导致迁移。

还有一些皱纹

如果您确实想要在删除时实现迁移,那么您必须在部署之后执行此操作。您还必须认识到,这样做不会节省任何当前磁盘空间。

Mongo 会预先分配空间,除非您进行数据库修复,否则它不会真正“归还”。因此,如果您删除文档上的一堆字段,这些文档仍会占用相同的磁盘空间。如果稍后移动文档,那么您可以回收空间,但是文档仅在它们增长时才会移动。

如果您从大量文档中删除一个大字段,您需要进行修复或检查新的就地 compact命令。

https://stackoverflow.com/questions/3604565/

相关文章:

performance - 字段类型在 MongoDB 索引中是否重要?

mongodb - MongoDB批量FindAndModify的解决方案

node.js - 将数据插入 MongoDB - 没有错误,没有插入

node.js - 聊天项目 - 使用 socket.io 进行负载平衡

javascript - MongoError : cannot change _id of a d

node.js - Mongoose,查找,返回特定属性

mongodb - 更新 mongodb 中的嵌套文档

mongodb - 当父字段未知时,在嵌套文档中查找具有字段的记录

java - 指定字段对于 MongoDB 是 transient 的,但对于 RestContro

python - 我可以只获取 Cursor 对象(pymongo)中的第一项吗?