文档中的空白字段会占用 Mongoose 的空间吗?
Posted
技术标签:
【中文标题】文档中的空白字段会占用 Mongoose 的空间吗?【英文标题】:Do empty fields in a document take up space in Mongoose? 【发布时间】:2015-12-06 16:55:56 【问题描述】:我没有采用继承或引用,而是考虑定义一个包含所有可能字段的模式。结果,模式将有许多字段,其中一些字段大部分时间都是空的。空字段是否仍会占用数据库空间?我应该改为定义单独的架构吗?
【问题讨论】:
定义“空”。 “字段”的任何定义都保存在数据存储中,或者实际上“任何地方”都将使用“一些空间”。没有什么是免费的。当然,除非它根本不存在。 “空”是指该字段已在架构中定义,但未包含或指定在要保存的文档中。 您是否尝试过创建文档然后查看在这种情况下会发生什么?此外,标题 "..take up space in mongoose?" 可能会误导您的意图。如果您的意思是 "..stores data in database when I omit them.."* 那么一个简单的测试应该可以回答这个问题。但这也完全取决于问题中明显缺失的实际模式定义。对于存储的“占用空间”的一般说明也是如此吗?还是客户端消耗的内存?不知道你问的是哪一个。因此,您实际上可能会尝试说清楚。或者“尝试”存储一些东西。 你建议我如何设计简单的测试?数据库存储在硬盘上,但这有关系吗?为什么要查看实际的架构定义? 【参考方案1】:由于您使用的是 Mongoose,因此答案涉及很多细微差别。 Mongoose 会根据字段的类型做各种事情。如果您定义Number
类型的字段String
例如
name: String,
age: Number
姓名和年龄都不是“必填”字段。一旦你打电话给create
,只用名字例如
model.create(name: 'Yuri')
然后在您的数据库中,您将拥有一个只定义了名称的对象
_id: ObjectId('....'), name: 'Yuri'
换句话说,猫鼬不会存储年龄。
但另一方面,如果您有一个声明为数组的字段,例如
name: String,
ages: []
那么如果你执行和上面一样的create
调用,就会产生如下文件:
_id: ObjectId('...'), name: 'Yuri', ages: []
也就是说,即使您没有在 create 调用中指定 ages
,mongoose 还是会为您创建数组。同样的机制也适用于嵌套对象。
TLDR:如果您的架构是扁平的,并且仅由字符串和数字组成,那么 mongoose 不会将这些字段保存在数据库中,但会保存对象和数组。
【讨论】:
以上是关于文档中的空白字段会占用 Mongoose 的空间吗?的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值
使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段