【问题标题】:Query the string type Date in mongodb在mongodb中查询字符串类型Date
【发布时间】:2012-03-08 00:39:50
【问题描述】:

这是我在 mongodb 中的查询

db.order.find ({"ublExtensions.ublExtensions.extensionContent.Metadata
                .ModificationTime": "2012-02-04T01:58:27.861Z"});

它仅获取特定时区的结果。修改时间每天都在变化。我有一个要求,我需要选择 y'day 更新的数据...意思是(sql 中的 sysdate -1)一天数据。

如何在 mongodb 中实现这一点?请注意,我的日期是字符串类型,我有一个无法更改的约束。有人建议使用 ISODate。

请帮忙解决这个问题。

【问题讨论】:

  • 我很确定您唯一的解决方案是遍历每个文档并将日期字符串转换为日期,以便您可以正确测试它。 Mongo 只将其视为一个字符串。有什么方法可以在更新文档时存储另一个正确的日期字段?然后您可以简单地查询 UTC 中的所有内容
  • mongo中有没有像sql中的to_char、to_date这样的日期转换函数?
  • 我们如何使用 ISODate、Date() 或 new Date() 将其用作 sysdate-1

标签: mongodb


【解决方案1】:

Mongodb 以 bson 格式存储其日期对象,例如:{$date: 1329415205151}

如果您决定以字符串格式存储它,则过滤和处理此值是客户端的责任,因为 mongo 将其视为字符串。您可以通过参考其他 SO 问题将字符串转换为日期对象:How do I convert a property in MongoDB from text to date type?

广泛建议将所有日期存储在 UTC 或可能与本地数据中心相关的一致时区,然后将您的日期值转换为客户端上正确的本地时区。

您可以存储所需的任何日期值。日期的和日期的格式是两个独立的问题。如果您的约束要求您在文档中存储基于字符串的日期格式,建议在更新时也存储一个 $date 对象。

【讨论】:

  • @jdi 你能看看我在这篇文章中的回答,如果我错了告诉我。
【解决方案2】:

我建议将您的日期存储为 MongoDB 上的 Date 或 ISODate,因为它可以让您的生活更轻松 :)

如果不可能,那么在客户端(特定于编程语言的驱动程序)上,您应该能够将字符串解析为适当的日期类型。

但是,如果您需要在 mongo shell 上运行查询,您可以遵循类似于Mongo Cookbook 中所述的策略

1) 用今天和昨天的日期创建一个 var:

>var today = new Date();
>today
ISODate("2012-11-26T22:12:03.870Z")
>var yesterday = new Date()
>yesterday.setDate(today.getDate() - 1)
>yesterday
ISODate("2012-11-25T22:12:03.870Z")

2) 形成查询以查找 24 小时内的文档

>db.order.find( { "ublExtensions.ublExtensions.extensionContent.Metadata.ModificationTime" : { $gte : yesterday, $lt : today } } )

【讨论】:

    【解决方案3】:

    为什么你不能只使用$gt查询,比较时间你可以使用Date.now(),从Date.now()你可以使用以前的日期,比如如果当前日期是"2017-05-16T02:08:48.419+05:30",那么你将编写查询

    db.collection.find({"createdAt": { $gte : new ISODate("2017-05-15T02:08:48.419+05:30") }})
    

    【讨论】:

    • 这基本上正是@Ghasfarost 在他的回答中所说的,除了他的回答首先建议将日期存储为日期对象而不是字符串。这个答案忽略了这样一个事实,即它们首先必须存储为日期才能使日期查询起作用。操作员说将它们存储为字符串是他们不能放弃的约束。
    • @jdi 谢谢,我很糟糕,我只是没有阅读@Ghasfarost 的完整答案。
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2022-01-07
    • 2019-05-12
    • 2015-11-13
    • 2016-01-23
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多