【问题标题】:MongoDB find date range if overlap with other dates如果与其他日期重叠,MongoDB会查找日期范围
【发布时间】:2015-01-08 16:55:03
【问题描述】:

我有许多文档,其架构如下所示,每个文档都包含(开始日期、结束日期),如下面的架构所示。是否有一种简单的方法可以在保存新文档之前知道新文档的开始日期、结束日期是否会与之前保存的文档开始日期、结束日期重叠?谢谢

{
    "title" : "",
    "owner" : "",
    "notes" : "",
    "startdate" : "",
    "enddate" : ""
}

以下是当前保存的唯一文档:

Document.(anonymous function) {_id: "FADnPAxRu4Ps5hkLz", 
   title: "Round A", 
   customerid: "QDGvBQhS6vYgZtnRr", 
   startdate: "11/21/2014 7:25 AM"…}
_id: "FADnPAxRu4Ps5hkLz"customerid: "QDGvBQhS6vYgZtnRr"
enddate: "11/30/2014 6:09 AM"
startdate: "11/21/2014 7:25 AM"
title: "Round A"__proto__: Document.(anonymous function)

当我尝试对上述文档执行以下任何查询时,它什么也不返回,即使这里有明显的重叠。

db.Projects.find({'startdate': {$lt: '11/25/2014 6:26 PM'}, 'enddate': {$gt: '11/19/2014 6:26 PM'}}, {sort:{time: -1}});

db.Projects.find({'startdate': {$lt: '11/30/2014 6:26 PM'}, 'enddate': {$gt: '11/21/2014 6:26 PM'}}, {sort:{time: -1}});

【问题讨论】:

  • 您的“日期”是字符串,没有按词法排序。将这些转换为正确的Date type

标签: mongodb mongodb-query


【解决方案1】:

时间重叠可以用下图中的这 4 种情况来说明,其中 S/E 是新文档的开始日期/结束日期,S'/E' 是任何现有文档的开始日期/结束日期:

  S'                  E' 
  |-------------------|

   S                E 
   |****************|

S'          E' 
|-----------|

      S'          E' 
      |-----------|

              S'          E' 
              |-----------|

在 4 种情况下,我们有 S'<EE'>S。查找所有时间重叠的文档的查询可以是:

db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})

编辑:

您的 startdate 和 enddate 是字符串格式,并且不是按词法排序的,因此不能使用 "$gt" 和 "$lt" 进行比较。您应该将它们转换为日期类型:

db.collection.find().forEach(
  function (e) {
    // convert date if it is a string
    if (typeof e.startdate === 'string') {
       e.startdate = new Date(e.startdate);
    }
    if (typeof e.enddate === 'string') {
       e.enddate = new Date(e.enddate);
    } 
    // save the updated document
    db.collection.save(e);
  }
)

最终查询将是:

db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})

【讨论】:

  • 感谢您的帮助,但我没有从执行上述查询中得到任何结果,尽管日期是否重叠我总是得到 LocalCollection.Cursor {collection: LocalCollection, sorter: Minimongo.Sorter, _selectorId:未定义,匹配器:Minimongo.Matcher,跳过:未定义...} ...任何线索我可能会丢失,在这里做错了吗?再次感谢
  • @MChan,发布您的查询和一些数据,以便我们找出您的问题。
  • 我用我保存的唯一文档和我尝试执行的查询更新了问题
  • 我看到了这个问题。您在“startdate”和“enddate”中使用字符串类型而不是日期类型。您应该改用 Mongo ISODate。 sort() 中的“时间”字段在哪里?它不在您的文档中。
  • 时间是我从程序中的另一个查询中复制的错误,其中我有时间字段。关于开始日期,结束日期,如果我从表单字段中获取日期,如何将字段设置为日期,将其发布到数据库而没有预定义的模式?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多