【问题标题】:How to query documents by Date in MongoDB?如何在 MongoDB 中按日期查询文档?
【发布时间】:2014-07-14 20:40:36
【问题描述】:

我的事件集合存储以下文档:

{
  "_id": {
      "$oid": "537b2a232a47f21830ae5b7b"
  },
  "startTime": {
      "$date": "2014-05-18T21:00:00.000Z"
  },
  "endTime": {
      "$date": "2014-05-18T23:00:00.000Z"
  }
},
{
  "_id": {
    "$oid": "537af8136c4162d0379e2139"
  },
  "startTime": {
    "$date": "2014-05-19T20:30:00.000Z"
  },
  "endTime": {
    "$date": "2014-05-19T21:30:00.000Z"
  }
}

如何按特定的 startTime 查询事件,如下所示:

var startTime = '2014-05-18T20:00:00.000Z';

db.collection.find({startTime: {$eq: startTime}});

我的问题是我需要忽略时间并在查询中只使用日期。如何构建我的查询?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您需要创建 Date 对象,这应该会有所帮助

    var start = new Date(2010, 3, 1);
    var end = new Date(2010, 4, 1);
    

    http://cookbook.mongodb.org/patterns/date_range/

    【讨论】:

    • 但我只有startTime。
    • db.collection.find({startTime: {$eq: new Date("2014-05-19T20:30:00.000Z")}});
    • 我收到以下错误:“不能将 $eq 与 Date 一起使用。”
    • 像这样试试 db.collection.find({"createdAt" : new Date("2014-05-19T20:30:00.000Z") });从这里stackoverflow.com/questions/8835757/return-query-based-on-date
    【解决方案2】:

    在您要查询的当天的午夜和第二天的午夜定义一个日期。然后使用$lt(小于)和$gt(大于)运算符获取这两个时间点之间时间跨度内的所有结果。

    var from = new Date('2014-05-18T20:00:00.000Z');
    var to = new Date('2014-05-19T20:00:00.000Z');
    
    db.collection.find({startTime: {$gt: from, $lt:to}});
    

    【讨论】:

    • 如何根据 startTime 创建 endTime?
    • @Erik 您可以使用somedate.setDays(someDate.getDays() + 1) 增加日期的日期。是的,这适用于月份边界。尝试将日期设置为 1 月 32 日会将其设置为 2 月 1 日。更多关于 node.js 和日期操作in this blog article.
    • 谢谢!我怎么能忽略时间?
    • @Erik 你不能。 Date 对象始终代表一个特定的时间点,精确到毫秒。一天是一个 24 小时的时间段。时间段由开始日期和结束日期定义。当您要选择给定 24 小时时间段内的所有日期时,您需要查询大于该时间段开始时间且小于该时间段结束时间的所有日期。
    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 2020-05-16
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多