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

时间:2015-08-21 19:55:37

标签: node.js mongodb date mongodb-query date-range

我有一个预订系列。在该集合中,我已经调试了一个文档:

{
"_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 个答案:

答案 0 :(得分:0)

这个查询怎么样?

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在查询的文档日期范围之前和结束之后开始检查

答案 1 :(得分:0)

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

{ $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