【问题标题】:MongoDB - Check if Date Range A overlaps other Date Ranges bMongoDB - 检查日期范围 A 是否与其他日期范围 b 重叠
【发布时间】:2015-08-21 19:55:37
【问题描述】:

我有一个收藏预订。在该集合中,我可以调试一个文档:

{
"_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 策略。

我的 App 是 Node JS + Express + MongoClient 环境。

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

【问题讨论】:

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


    【解决方案1】:

    这个查询怎么样?

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

    【讨论】:

    • 一会儿我要试试! :-) 乍一看,它看起来不错
    • 我已经更新了查询,以便匹配是包容性的,即如果日期范围 B 正好在查询文档日期范围的末尾开始,则匹配。这是否给出了预期的结果?
    • 一个问题到目前为止它在 MySql 中的表现如何?
    • 你是什么意思,比如你将如何写一个像上面这样的查询,但是在 MySql 中?也许你应该提出另一个问题,因为我写了一个 SQL 查询已经有一段时间了:)
    【解决方案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。
    • 谢谢你,我会试试的!
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多