【问题标题】:MongoDB “empty” or NULL DateMongoDB“空”或 NULL 日期
【发布时间】:2019-10-07 16:28:54
【问题描述】:

我将开始在一个项目中使用 MongoDB 并进行以下观察: “日期”必须是有效的时间点,不能为NULL

在 MongoDB 中,我们不能存储 NULL 日期,所以我猜最好的办法就是从我们的文档中简单地排除日期字段

例如,如果我有一个“汽车”文档和一个名为“date_sold”的字段。如果汽车还没有售出,我只是从文档中排除此字段。汽车售出后,我可以添加“date_sold”字段

通过上述操作,我假设我可以查询已售或未售汽车的记录。这是在 MongoDB 中处理“空”或空日期的推荐方法吗?

附:我的困惑源于这样一个事实,因为 SQL 有一个架构,日期或日期时间字段可以存储为 NULL,但在 MongoDB 中,“日期”字段不能为 NULL,并且必须是有效的时间点。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    当没有要存储的日期时省略日期字段在 MongoDB 中可以正常工作,这与传统 SQL 数据库不同,在传统 SQL 数据库中,每个记录/文档都必须遵循相同的架构。

    您可以使用$exists 来测试该字段中的值。

    【讨论】:

      【解决方案2】:

      MongoDB 类型为BSON

      如果你去DATE那里输入,你会读到:

      BSON 日期是一个 64 位整数,表示 自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数。这导致一个 可表示的日期范围为过去约 2.9 亿年 未来。

      因此,您需要为每个数据类型定义本身提供一个“时间点”。

      通常是 Unix 纪元 -> Jan 1, 1970 用作 null 以便在大多数处理此类日期的数据库系统上遵循良好实践(如果您不需要使用旧日期那些)。

      记住这一点:

      BSON 日期类型已签名。负值表示 1970 年之前的日期。

      所以,你也可以为你的开发设置一个约定的默认值,也就是过去只是为了这个目的。例如:

      Jan 1, 1900

      我希望这能澄清你。

      更多提示:通常json 结构可能会在不同的步骤中进行验证,我强烈建议您维护该字段,并使用约定值在您的系统下表示NULL

      【讨论】:

      • Alejandro,在发布我的信息之前,我和你一样,正在考虑将一些非常古老或未来的日期设置为我的“空”约定。我知道这会起作用,但对我来说确实有点“hacky”,因为这意味着所有 mongodb 用户都有不同的约定。如果我没有从上面提到的“缺失领域”想法中得到一些反馈,我可能最终会尝试看看它是如何工作的。当然,这将涉及大量查询测试,以确保我不会遇到无法预料的问题。无论如何,感谢您的回复,我投了赞成票。
      • 非常感谢@CarolineBeltran。我的背景是后端计费系统分析师,然后,在他们使用的接口类型中,通常使用这些约定(正如您所说,每个都有不同的约定)。正如您所指出的,Ian 的回答也很棒,因为它轻松解决了“插入”问题:) 真诚感谢您的反馈 Caroline!我也赞成 Ian 的回答,因为我认为这真的很有帮助,并且会解决您的问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多