文档中的空白字段会占用 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 中的“__v”字段是啥

Mongoose 中的“__v”字段是啥

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

如何将子文档中的字段更改为 Mongoose 中的父字段