如果与其他日期重叠,MongoDB会查找日期范围

时间:2014-11-11 23:53:28

标签: mongodb mongodb-query

我有很多文档,下面显示的模式包含(开始日期,结束日期),如下图所示。如果新文档startdate,enddate将与之前保存的文件startdate,enddate重叠,是否有一种简单的方法可以在保存新文档之前知道?感谢

{
    "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}});

1 个答案:

答案 0 :(得分:11)

时间重叠可以用下图中的这四种情况来说明,其中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")}})