mongodb mongoose查询,用于查找startDate和endDate是否与startDates和endDates对象数组中的任何对象相交

5vf7fwbs  于 2023-03-22  发布在  Go
关注(0)|答案(1)|浏览(126)

我试图查找特定的startDate和endDate是否与mongoDb中的任何日期对象重叠。
以下是db

中的数据
请注意,这是一个对象数组。
现在我有了这样的约会

init Date >>>>>>>>>>>>>>>>> 2023-03-23T04:03:49.642Z

Ending Date >>>>>>>>>>>>>>>>> 2023-04-10T04:03:49.642Z

现在我需要返回这个文档,如果它是重叠的,否则什么都不返回。
这是我一直在努力做的

const getAvailabilityDetails = await Products.find({
    _id: pid,
    bookings: {
      $elemMatch: {
        // $and: [
          productBookingStartDate: { $lt: new Date(initDate.toString()).toISOString() },
          productBookingCompleteDate: { $gt: endingDayBufferCalcWithContractDays }
        // ]
      }
    }
  });

它在任何情况下都不起作用。在调试查询中,我得到了这样的东西。

Mongoose: products.find({ _id: ObjectId("63de4823561e0319a5745537"), bookings: { '$elemMatch': { productBookingStartDate: { '$lt': new Date("Thu, 23 Mar 2023 04:03:49 GMT") }, productBookingCompleteDate: { '$gt': new Date("Mon, 10 Apr 2023 04:03:49 GMT") } } }}, { projection: {} })

任何人都可以请帮助我解决这个问题。

9nvpjoqh

9nvpjoqh1#

为了检查时间范围a-〉b和时间范围c-〉d之间的重叠,我们需要接受4个选项:[acdbcabdcadbacbd]并拒绝两个选项:[abcdcdab],所以我们想找到cbda的情况:

db.collection.find({
  _id: pid,
  bookings: {
    $elemMatch: {
      productBookingCompleteDate: {$gt: new Date(initDate)},
      productBookingStartDate: {$lt: new Date(endDate)}
    }
  }
})

了解它在playground example上的工作原理

相关问题