【问题标题】:Get all elements in an array inside of a document that have a date greater than now in mongo db在mongo db中获取日期大于现在的文档内数组中的所有元素
【发布时间】:2020-10-22 00:37:06
【问题描述】:

我有一个名为 FilmSessions 的集合,每个 FilmSession 文档都有一个名为 seat 的属性

{
'filmName': 'string',
'seats': Seat[]
}
 // example with data
{
'filmName': 'Batman',
'seats': [
    {
      'state': 'available',
      'seatNumber': 1
   },{
      'state': 'available',
      'seatNumber': 2
   }
 ]
}

未预留座位示例

{
 'state': 'available',
'seatNumber': 1
}

一旦客户选择并预留座位,客户需要付费

{
 'state': 'reserved',
 'reservedAt': DATE
 'seatNumber': 1
}

一旦客户支付了座位,座位将转为付费

{
 'state': 'paid',
 'paidAt': DATE
 'seatNumber': 1
}

我想获取所有 FilmSessions,其中至少一个席位状态设置为 reserved,字段 reservedAt 存在且已过期(自设置为 reservedAt 以来已过去 15 分钟,这意味着客户没有购买座位,我们可以提供)

当获得至少保留一个座位的 FilmSessions 时。我想得到所有的集合,而不仅仅是保留的集合

我使用的是 mongodb,我无法更改结构

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    获取至少保留一个席位的所有 FilmSession 文档并获取已保留的席位,其中 reservedAt 时间戳为 超过 15 分钟前,您可以使用 nodejs 中的 mongodb 驱动程序编写以下查询:

    db.collection("FilmSessions").find({
      "seats.state": "reserved",
      "seats.reservedAt": {
        $lt: new Date(Date.now() - (1000*60*15))
      }
    },
    {
      "filmName": 1,
      "seats": {
        "$elemMatch": {
          "reservedAt": {
              $lt: new Date(Date.now() - (1000*60*15))
          }
        }
      }
    })
    
    

    这里是link to MongoPlayground,您可以从中了解这一点(上面计算的时间戳在 MongoPlayground 示例中是硬编码的,但应该让您了解查询的工作原理)。

    【讨论】:

      【解决方案2】:
      • 从当前日期删除 15 分钟并检查条件 reservedAt 日期小于输入日期
      let reservedAt = new Date();
      reservedAt.setMinutes(reservedAt.getMinutes() - 15);
      
      db.collection.find({
        "seats.reservedAt": {
          $lt: reservedAt
        }
      })
      

      Playground

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-01
        • 2022-06-12
        • 2017-12-04
        • 1970-01-01
        • 2021-03-26
        • 2021-06-09
        • 2021-04-01
        相关资源
        最近更新 更多