繁体   English   中英

在 MongoDB 中存储空值与根本不存储密钥

Storing null vs not storing the key at all in MongoDB

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在我看来,当您创建一个 Mongo 文档并且有一个字段{key: value}有时不会有值时,您有两个选择:

  1. Write {key: null}即在字段中写入空值
  2. 根本不要将密钥存储在该文档中

这两个选项都很容易查询,一个是查询{key : null} ,另一个是查询{key : {$exists : false}}

我真的想不出这两个选项之间的任何差异会对应用程序场景产生任何影响(除了选项 2 的存储略少)。

谁能告诉我是否有任何理由让人们更喜欢这两种方法中的任何一种,为什么?

编辑

在问这个问题之后,我还发现索引在两种情况下的行为可能不同,即可以为选项 2 创建稀疏索引。

4 个回复

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

你忘记了空值的特殊性。 Query on key: null将检索所有 key 为 nullkey 不存在的文档。

当对$exists:false进行查询时,将仅检索字段键不存在的文档。

回到你的确切问题,这取决于你的查询和数据代表什么。 如果您需要保留它,例如,用户设置一个值然后取消设置它,您应该将该字段保留为空或空。 如果您不需要,您可以删除此字段。

请注意,由于 MongoDB 不使用字段名称字典压缩,因此field:null会消耗磁盘空间和 RAM,而根本不存储 key 不会消耗资源。

这真的归结为:

  • 你的场景
  • 您的查询方式
  • 您的索引需求
  • 你的语言

我个人选择存储空键。 它可以更轻松地集成到我的应用程序中。 我将 PHP 与 Active Record 和 uisng null 值一起使用使我的生活更轻松,因为我不必将字段依赖的压力放在应用程序上。 此外,我不需要编写任何复杂的代码来处理设置不存在的变量的魔法。

我个人不会存储像""这样的空值,因为如果你不小心,你可能会有两个空值null"" ,然后你会有一个偶然的时间专门查询。 所以我个人更喜欢null为空值。

至于空间和索引:这取决于有多少行可能没有这个列,但我怀疑你真的会注意到由于一些额外的 null 文档导致索引大小增加。我的意思是存储的差异是微小的,特别是如果相应的键名也小。 这也适用于大型设置。

坦率地说,我不确定$existsnull之间的索引用法,但是null可能是一种更标准化的方法来查询存在,因为请记住 MongoDB 是无模式的,这意味着您不需要在文档中再次生成该字段两个空值:不存在和null 所以最好选择其中之一。

我选择null

您可能需要考虑的另一点是何时使用 Hibernate OGM 等 OGM 工具。

如果您使用的是 Java,Hibernate OGM 支持 JPA 标准。 因此,如果您可以编写 JPQL 查询,那么如果您想切换到 OGM 工具支持的备用 NoSQL 数据存储,理论上您会很容易。

JPA 没有为 Mongo 中的 $exists 定义等效项。 因此,如果您的集合中有可选属性,那么您将无法为其编写正确的 JPQL。 在这种情况下,如果属性的值存储为 NULL,那么仍​​然可以编写一个有效的 JPQL 查询,如下所示。

SELECT p FROM pppoe p where p.logout IS null;
1 加密:当我甚至根本不存储密钥时,是否需要加密密钥?

我在网上搜索过,包括SO:在散列和存储它们之前需要对密码进行密码讨论。 如果密码用于计算用于加密的密钥(“基于密码的加密”):如果您不将密码存储在al? [注意:我确实读过SO: Passphrase,Salt和IV,我需要所有这些吗? IV是否像盐一样工作当然是一个相关的问题 ...

3 scanf不能立即/根本不存储正确的值吗? [等候接听]

我在使用scanf将用户输入的值存储到变量时遇到麻烦。 第一种情况是用户输入的值会被存储但不是立即存储? 在此部分,无论我输入什么数字,代码都会打印出错误消息,然后接受正确的值。 例如:我运行代码,输入6,然后得到打印的错误消息,当我再次输入6时,它继续。 在第二部分中,无论用 ...

2019-11-11 14:41:32 0 42   c
5 如何查询可以存在空值或根本不存在的关系

我在查询可以存在空值或根本不必存在的关系时遇到一些问题。 示例数据库: 我想查询具有 f.name = name 和 f.name = description 并且描述为空或不存在的文档,因此我将获得 ID 为 1 和 2 的文档。 示例代码: 我将非常感谢您的帮助 ...

6 NULL不存储在MongoDB中

我正在编写一个Spring Batch Job,它从Postgres DB读取值并将其存储在MongoDB中。 但问题是,postgres中有一些列具有vales和NULL值,但Mongo在将其写入MongoDB时忽略了这些列。 我已经明确地将空值设置为Batch的处理阶段中的那些列并将 ...

8 JavaScript根本不存储变量。 每个变量“未定义”

我想知道是否有人可以帮助我。 问题是javascript没有存储任何变量并且正在起作用。 第二个警报根本不会发生,当我单击按钮以触发test_function()时,它会发出“ helloundefined”警报。 我只是不知道该怎么办,工作正常,然后突然停止了。 我应该提到,这是 ...

9 如何让空值不存储在 Pandas Python 的 HBase 中?

我有一些示例数据如下: 我想让这些数据存储在 Hbase 中,我使用下面的代码来实现它。 当我在 Hbase 上查询get 'test', 'a201911012' ,得到以下结果: 如何确保空值不存储在 Pandas Python 的 HBase 中? 我们不需要 null 或空字符串 ...

10 一种将密钥存储在字典中而不存储密钥的方法?

例如,如果编写字典类,则冲突很少见,但确实存在。 因此,您需要存储密钥,以确保在哈希表中找到密钥时,它是正确的密钥,而不是冲突。 有时密钥很长,通常是字符串,因此与仅是哈希码相比,每个密钥可以超过40个字节。 如果存储的密钥是​​对对象进行哈希处理,但使用略有不同的哈希算法且具有不同的 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM