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
我有 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