既然mongo没有模式,这是否意味着我们在更改模型时不必进行迁移?

对于非关系数据库,迁移过程是什么样子的?

推荐答案

我认为这是一个非常好的问题,但根据您使用的LIB和您对"迁移"的期望,答案会有点分散.

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

  • Add a field: Mongo让这一切变得非常简单.只需添加一个字段,就完成了.
  • Delete a field:从理论上讲,你实际上并没有和你的模式联系在一起,所以这里的"删除"是相对的.如果删除"属性",不再加载该字段,那么该字段是否在数据中并不重要.因此,如果您关心"清理"数据库,那么删除字段不会影响数据库.如果你关心清理数据库,你基本上需要对数据库运行一个巨大的for循环.
  • 这也是一个难题.当你重命名一个字段"where"时,你是在重命名它吗?如果希望DB反映新的字段名,那么基本上必须在DB上执行一个巨大的for循环.为了安全起见,您可能需要"添加"数据,然后推送代码,然后"取消设置"旧字段.

Some Wrinkles

然而,字段名与ActiveRecord对象串联的概念有点偏颇.ActiveRecord对象有效地提供了对象属性到实际数据库字段的映射.

在典型的RDBMS中,字段名的"大小"实际上并不相关.然而,在Mongo中,字段名实际上占用了数据空间,这在性能方面造成了很大的差异.

现在,如果您正在使用某种形式的"数据对象",比如ActiveRecord,为什么要try 在数据中存储完整的字段名?数据库可能应该按照字母顺序存储所有字段,并在对象端使用映射.因此,一个文档可以有8个字段/属性,数据库名称为"a"、"b"..."j",但对象名称应该是可读的,比如"名称"、"价格"、"数量".

我之所以提出这个问题,是因为它在Modify a field name的基础上又增加了一条皱纹.如果要实现映射,那么修改字段名实际上根本不会导致migrations.

Some more Wrinkles

如果你想在删除时实现迁移,那么你必须在部署时实现.您还必须认识到,这样做不会节省任何当前磁盘空间.

Mongo预先分配了空间,除非您进行数据库修复,否则它不会真正"归还".因此,如果删除文档中的一组字段,这些文档仍会占用磁盘上的相同空间.如果以后移动文档,则可以回收空间,但是文档只有在增长时才会移动.

如果从大量文档中删除一个大字段,则需要执行修复或签出新的就地compact命令.

Mongodb相关问答推荐

在MongoDB查询中添加来自另一个集合的匹配文档的计数

在MongoDB集合中按文档内的频率对数组排序

Spring数据MongoDB(聚合)

MongoDB 对特定搜索查询的响应时间较长

如何向所有文档添加一个字段,其中前 100 个文档的值为 1,接下来的 100 个文档的值为 2,依此类推?

可变用户 Select

mongoose中的 required是什么意思?

MongoDB聚合多条件

为什么 local.oplog.rs 上每隔几分钟的活动就会锁定 mongo 客户端

Mongoose $push 不断添加两个条目

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

无法从 javascript 打印 BSON 对象

如何解决 ClassNotFoundException:com.mongodb.connection.BufferProvider?

有没有办法将python对象直接存储在mongoDB中而不序列化它们

java.lang.IncompatibleClassChangeError:Implementing class Mongo

在 mongodb 中的索引列上查找重复项的快速方法

MongoDB 在 mongoengine 中使用 OR 子句

C# MongoDB 驱动程序 - 如何使用 UpdateDefinitionBuilder?

带有 either or查询的mongoose findOne

在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么