使用 unix 时间戳查询 MongoDB 中的空闲时间段

Query free timeslots in MongoDB using unix timestamps

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

我想过滤掉那些 MongoDB 文档,其中预订的时间段仍然是免费的,这样就不会与现有预订重叠。

我的 collection 个条目:

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

输入“发件人:1593500000”和“收件人:1593600000”的预期结果。

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

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

输入“发件人:1593670000”和“收件人:1593690000”的预期结果。

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

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

是否可以通过单个查询完成此操作?例如使用 between 或类似的东西? 或者有更好的approach/best做法吗?

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

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

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

Mongo Playground