【问题标题】:Query free timeslots in MongoDB using unix timestamps使用 unix 时间戳查询 MongoDB 中的空闲时隙
【发布时间】:2020-07-01 17:02:15
【问题描述】:

我是 MongoDB 新手,可能这是一个常见的用例,但我没有找到这个特定案例的答案。

我想过滤掉那些预订时间段仍然空闲的 MongoDB 文档,因此不会与现有预订重叠。

我的收藏条目:

  {
    "_id": "5efc9f89749c983ffd58c55f",
    "training": "football",
    "bookings": [
      {
        "from": 1593607419,
        "to": 1593622800
      }
    ]
  },
  {
    "_id": "5efc9f89749c983ffd58c55f",
    "training": "baseball",
    "bookings": [
      {
        "from": 1593607419,
        "to": 1593622800
      },
      {
        "from": 1593687419,
        "to": 1593722800
      }
    ]
  }

输入“From: 1593500000”和“To: 1593600000”的预期结果。

  {
    "_id": "5efc9f89749c983ffd58c55f",
    "training": "football"
  },
  {
    "_id": "5efc9f89749c983ffd58c55f",
    "training": "baseball"
  }

两个文件都有空闲时间段(不与现有预订重叠)。

输入“From: 1593670000”和“To: 1593690000”的预期结果。

  {
    "_id": "5efc9f89749c983ffd58c55f",
    "training": "football"
  }

只返回足球,因为查询的值与棒球的第二个预订条目重叠。

是否可以通过单个查询来做到这一点?例如使用 between 或类似的东西? 还是有更好的方法/最佳实践?

我使用 Spring Data REST 实现查询,但对 mongodb 查询提供一些帮助已经非常有帮助了。

【问题讨论】:

    标签: mongodb mongodb-query spring-data-mongodb


    【解决方案1】:

    这更像是一个逻辑问题,我对Spring Data不熟悉,你的查询应该是这样的。

    {
      bookings: {
        $not: {
          $elemMatch: {
            $or: [{
              from: { $gte: start, $lte: end }
            }, {
              to: { $gte: start, $lte: end }
            }]
          }
        }
      }
    }
    

    Mongo Playground

    【讨论】:

    • 您的回答已经很有帮助了,谢谢!不幸的是,我还需要两次预订之间有免费时间段的所有文件。示例:开始:1593622801,结束:1593687418。=> 应该返回两个文件足球和棒球,因为在两个预订之间仍然有一个免费的棒球时间段。您知道如何考虑这种情况吗? Mongo Playground
    • 我现在能想到的,是根据您可能的最小增量将范围转换为离散值。我们可以尝试对这些值应用集合操作。您可以计算的最小增量是多少? 1秒? 1分钟? 15分钟? 1 小时?
    • 最小增量为一分钟。
    • @Dennis 很抱歉将您与那些离散值方法混淆了,我误解了要求。我以为给出的范围是开始:1593607419,结束:1593722800。请检查更新的答案,我在最初的答案中犯了一些逻辑错误
    • 这正是我所需要的。感谢您的帮助,非常感谢!
    猜你喜欢
    • 2015-11-18
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多