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

4
我有一个集合booking,在这个集合中我有一个用于调试的文档:
{
"_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")}}]});

当我执行查询时,有时候会得到结果,但是当我改变查询中的日期时,就没有结果了。这不合逻辑!我不知道查询是否正确,或者我应该改变策略。

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

希望得到解答, 谢谢大家问候DroidSheep

2个回答

4
这个查询怎么样?
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") } }
]});

它会检查日期范围B的开始是否在查询的文档日期范围内,或者日期范围B的结束是否在查询的文档日期范围内,或者日期范围B的开始早于并且结束晚于查询的文档日期范围。


一会儿我要试试看!:-) 刚开始看起来很不错 - DroidSheep
我已更新查询,使匹配具有包含性,即如果日期范围B恰好从查询文档日期范围的末尾开始,则匹配。这是否给出了预期结果? - sheilak
到目前为止,在MySql中应该怎么做? - DroidSheep
你的意思是,你想知道如何在MySQL中编写类似上面的查询语句吗?也许你应该开一个新的问题,因为我已经很久没有写过SQL查询了 :) - sheilak

2
我尝试过它,看起来不错,但当我执行这个查询时:
{ $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


是的,看起来它可以完成任务。您可以通过删除最后两个条件并在先前的条件中将$gt更改为$gte和$lt更改为$lte来简化它。 - sheilak
谢谢,我稍后会尝试! - DroidSheep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接