MongoDB文档:空值还是完全省略键值对?

3

我是第一次在项目中使用MongoDB,对于文档中的空白/未设置值,我不确定推荐的方法是什么。当您有可能将来会有值的键值对时,以下两种方法哪种更合适:

1)JSON中,description字段为空字符串(并且将来将被填充):

{
    "username": "jamies",
    "shortName": "camping",
    "setName": "Camping on Stevens",
    "description": ""
}

2) 或者,JSON 中省略了描述字段(将来会添加):

{
    "username": "jamies",
    "shortName": "camping",
    "setName": "Camping on Stevens"
}

显然,第二种方法可以节省磁盘空间,但也没有指示哪些值为null。我想了解Mongo开发人员/数据库管理员推荐/规定的是哪种方法,以及在查询或更新期间是否存在任何考虑因素。

如果未来大多数文档都可能设置该字段,则从一开始创建一个“虚拟”字符串来表示未设置的值并保留分配给该值的空间是有价值的(因此在将来添加它时不会增加文档大小,可能导致集合碎片化)。 - Asya Kamsky
Mongo默认会在每个文档周围添加一些缓冲区以避免碎片化。如果您仍然建议预定义字段,则最好使用本机类型null来指定值的缺失。 - Aravind Yarram
2个回答

4

当你不确定时

从简开始。根据测试需要增加其他维度。 jeff-atwood

上面的引用是指代码,但它同样适用于此处。我可以想到一些情况,你会后悔添加一个空字符串字段。例如,弃用该字段、不再使用它、让人困惑并且占用空间。此外,请参考MongoDB文档:查询和空值


Atwood先生的建议一如既往地好。感谢您的回答。 - Jamie S

1

一种方法是忽略与文档/聚合不适用的字段。像MongoDB这样的文档数据库是无模式的,并且本地支持此功能。然后,您可以使用$exists查询运算符。但是,如果您的用例依赖于存在的查询,则其性能不佳,需要使用其他设计。

另一种方法是使用null表示值的缺失。我认为建议使用null而不是添加元素并提供空字符串作为值。类似的讨论在这里XML,这是null还是空元素?


感谢您让我了解$exists运算符,我一定会使用null而不是空字符串。 - Jamie S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接