我认为这是一个非常好的问题,但根据您使用的LIB和您对"迁移"的期望,答案会有点分散.
让我们来看看一些常见的迁移动作:
Some Wrinkles
然而,字段名与ActiveRecord对象串联的概念有点偏颇.ActiveRecord对象有效地提供了对象属性到实际数据库字段的映射.
在典型的RDBMS中,字段名的"大小"实际上并不相关.然而,在Mongo中,字段名实际上占用了数据空间,这在性能方面造成了很大的差异.
现在,如果您正在使用某种形式的"数据对象",比如ActiveRecord,为什么要try 在数据中存储完整的字段名?数据库可能应该按照字母顺序存储所有字段,并在对象端使用映射.因此,一个文档可以有8个字段/属性,数据库名称为"a"、"b"..."j",但对象名称应该是可读的,比如"名称"、"价格"、"数量".
我之所以提出这个问题,是因为它在Modify a field name的基础上又增加了一条皱纹.如果要实现映射,那么修改字段名实际上根本不会导致migrations.
Some more Wrinkles
如果你想在删除时实现迁移,那么你必须在部署时实现.您还必须认识到,这样做不会节省任何当前磁盘空间.
Mongo预先分配了空间,除非您进行数据库修复,否则它不会真正"归还".因此,如果删除文档中的一组字段,这些文档仍会占用磁盘上的相同空间.如果以后移动文档,则可以回收空间,但是文档只有在增长时才会移动.
如果从大量文档中删除一个大字段,则需要执行修复或签出新的就地compact
命令.