MongoDB - 检查日期范围 A 是否与其他日期范围 b 重叠

MongoDB - Check if Date Range A overlaps other Date Ranges b

我有 collection 预订。在那个 Collection 里面,我有一个文件用于调试:

{
"_id": ObjectID("55d7608120b345d2cc7c9f45"),
"name": "booking1",
"start": ISODate("2015-01-10T00:00:00.000Z"),
"end": ISODate("2015-01-20T00:00:00.000Z")}

现在我有第二个日期范围,想检查日期范围 B 是否与其中一个预订文件重叠。

我的查询是:

db.booking.find({$or:[{"start":{$gt:ISODate("2015-01-15T00:00:00.000Z")}},{"end":{$lt:ISODate("2015-01-25T00:00:00.000Z")}}]});

当我执行它时,有时我会得到一个结果,而当我更改查询中的日期时,我没有得到任何结果。这不是逻辑!我不知道查询是否正确,或者我应该改变 mit 策略。

我的应用程序是 Node JS + Express + MongoClient 环境。

我希望得到答案, 谢谢大家的问候 DroidSheep

这个查询怎么样?

db.booking.find({ $or: [ 
  { start : { $lte: ISODate("2015-01-15T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-15T00:00:00.000Z") } },
  { start : { $lte: ISODate("2015-01-25T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-25T00:00:00.000Z") } },
  { start : { $gt: ISODate("2015-01-15T00:00:00.000Z") }, end : { $lt: ISODate("2015-01-25T00:00:00.000Z") } }
]});

检查Date Range B的开始在查询的文档日期范围内,或者Date Range B的结束在查询的文档日期范围内,或者Date Range B开始于查询文档之前结束于查询文档之后日期范围。

我已经试过了,它看起来不错,但是当我执行这个查询时:

{ $or: [ 
  { start : { $lte: ISODate("2015-01-5T00:00:00.000Z") }, end : { $gt: ISODate("2015-01-5T00:00:00.000Z") } },
  { start : { $lt: ISODate("2015-01-10T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-10T00:00:00.000Z") } },
  { start : { $gt: ISODate("2015-01-5T00:00:00.000Z") }, end : { $lt: ISODate("2015-01-10T00:00:00.000Z") } }
]}

mongo 没有响应我的文档。我尝试了多种解决方案,但 mongo 没有向我显示文档!不过还是先谢谢sheilak的提问。你好 DroidSheep

编辑:我的文档:

{
    "_id": ObjectID("55d78c3720b345d2cc7c9f49"),
    "name": "test_booking",
    "start": ISODate("2015-01-10T00:00:00.000Z"),
    "end": ISODate("2015-01-20T00:00:00.000Z")
}

编辑编辑: 我做了这样的解决方法:

{ $or: [ 
  { start : { $lte: ISODate("2015-01-01T00:00:00.000Z") }, end : { $gt: ISODate("2015-01-01T00:00:00.000Z") } },
  { start : { $lt: ISODate("2015-01-10T00:00:00.000Z") }, end : { $gte: ISODate("2015-01-10T00:00:00.000Z") } },
  { start : { $gt: ISODate("2015-01-01T00:00:00.000Z") }, end : { $lt: ISODate("2015-01-10T00:00:00.000Z") } },
  { start : ISODate("2015-01-10T00:00:00.000Z")},
  { end :  ISODate("2015-01-01T00:00:00.000Z")}
]}

是吗?你能检查一下吗?你好 DroidSheep