存储空VS不是在所有存储的关键在MongoDB中(Storing null vs not stori

2019-06-28 07:39发布

在我看来,当你创建一个文件蒙戈和有一个字段{key, value}这有时不会有一个值,你有两个选择:

  1. {key, null}即场写空值
  2. 不要存放在该文件中的关键,在所有

这两个选项很容易可查询,在一个你查询{key : null}和您查询其他{key : {$exists : false}}

我真的不能相信这将对应用场景的任何影响,这两个选项之间的差异(除了选项2有略少的存储)。

谁能告诉我,如果有一个希望无论是这两种方法比其他任何原因,为什么?

编辑

问它也发生,我认为指数可能表现不同的两种情况,即稀疏索引可以选择2创建的问题后。

Answer 1:

事实上,你也有第三种可能性: key: "" (空值)

你忘了一个关于空值的特异性。 上查询key: null ,其中的关键是空或者 key不存在将获取大家的文档。

当在查询$exists:false将检索只有在关键领域不存在文档。

回到你的问题询问这取决于你查询和数据代表什么的。 如果您需要保留,通过例如,用户设置的值,则取消它,你应该保持字段为空。 如果你不需要,你可以删除这个领域。



Answer 2:

需要注意的是,因为MongoDB的犯规用字段名字典压缩, field:null占用的磁盘空间和内存,而存储在所有的犯规没有钥匙消耗资源。



Answer 3:

它真的可以归结为:

  • 您的情况
  • 您的查询方式
  • 您的需求指数
  • 你的语言

我个人选择了存储空键。 这使得它更容易融入我的应用程序。 我使用PHP和活动记录和uisng空值使我的生活更轻松了很多,因为我没有在应用程序把现场depedancy的压力。 此外,我不需要做任何复杂的代码来处理魔法设置不存在的变量。

我个人不会像存储空值""因为如果你不小心,你可以有两个空值null""然后你就会有专门查询的HAP-危险时间。 所以,我个人更喜欢null空值。

至于空间和索引:这取决于有多少行可能没有这个科拉姆但我怀疑你会真正注意到索引大小增加,因为在空一些额外的文档我的意思是在存储不同的是,特别是如果相应的mineute键名也小。 这也适用于大型系统中了。

我很坦率地说不清楚的索引使用的$existsnullnull ,因为记住,MongoDB是无模式的,这意味着你没有要求必须在再次生成的文档该字段可以通过查询所有脑干更标准化的方法两个空值:不存在的和null 。 所以最好还是选择一种或另一种。

我选择null



Answer 4:

你可能要考虑的另一点是,当你使用OGM工具,如Hibernate OGM。

如果您使用的是Java,Hibernate的OGM支持JPA标准。 所以,如果你可以写一个JPQL查询,你如果要切换到这是由OGM工具支持备用的NoSQL数据存储在理论上容易。

为$蒙戈中存在JPA没有定义等同。 所以,如果你有你的收藏可选属性,那么你就不能写同一个适当的JPQL。 在这种情况下,如果属性的值存储为NULL,则仍然可以写一个有效的JPQL查询像下面。

SELECT p FROM pppoe p where p.logout IS null;


文章来源: Storing null vs not storing the key at all in MongoDB