【问题标题】:Node.js/MongoDB - querying datesNode.js/MongoDB - 查询日期
【发布时间】:2021-07-13 20:15:02
【问题描述】:

我在理解如何查询日期时遇到了一些问题;我认为问题可能与我的数据的结构有关。这是我数据库中的示例文档。

{

    "phone_num": 12553,
    "facilities": [
        "flat-screen",
        "parking"
    ],
    "surroundings": [
        "ping-pong",
        "pool"
    ],
    "rooms": [
        {
            "room_name": "Standard Suite",
            "capacity": 2,
            "bed_num": 1,
            "price": 50,
            "floor": 1,
            "reservations": [
                {
                    "checkIn": {
                        "$date": "2019-01-10T23:23:50.000Z"
                    },
                    "checkOut": {
                        "$date": "2019-01-20T23:23:50.000Z"
                    }
                }
            ]
        }
    ]
}

我正在尝试查询日期以查看特定房间是否在特定日期范围内可用,但无论我做什么,我似乎都无法获得正确的结果,无论是我的查询 404 还是返回空数组。

我真的尝试了所有方法,现在为简单起见,我只是想让查询与 checkIn 一起工作,以便找出我做错了什么。我尝试了下面代码的 100 种变体,但我根本无法让它工作。

  .find({"rooms": { "reservations": {   "checkIn" : {"$gte": { "$date": "2019-01-09T00:00:00.000Z"}}}}})

我是否误解了 .find 方法的工作原理,或者我存储日期的方式有什么问题? (我不断看到人们提到 ISODates,但不太确定那是什么或如何实施)。

提前致谢。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    我认为您发布的查询不正确。例如,如果您要查询入住时间在一定范围内的房间,那么查询应该是这样的 -

    .find({"rooms.reservations.checkout":{$gte:new Date("2019-01-06T13:11:50+06:00"), $lt:new Date("2019-01-06T14:12:50+06:00")}})
    

    现在您可以对结帐时间执行相同的操作,以进行适当的过滤以查找日期范围内的可用房间。

    不过,提个建议,从长远来看,您设计收藏的方式是不可持续的。例如,您尝试运行的日期查询将为您提供正确的文档,但不是每个文档中满足您的日期范围的房间。你必须在服务器端自己做(假设你没有使用聚合)。这将阻止您的服务器处理其他不可取的待处理请求。我建议您将集合分解,将 roomsreservations 放在单独的集合中,以便于查询。

    【讨论】:

    • 感谢工作!快速提问,“预订”包含预订房间的日期范围,我试图实现一个查询,用户将输入入住日期和退房日期,它将返回该日期范围内的所有可用房间.你建议我怎么做?我的查询是否应该搜索在该日期范围内已预订的房间,然后将它们从房间总列表中删除?如果不是,实现上述目标的查询会是什么样子?再次感谢伙计!
    • 在这种情况下您应该使用聚合。在房间和预订子文档上使用“$unwind”,然后使用简单的“$match”查找满足条件的房间。这是聚合的文档 - docs.mongodb.com/manual/aggregation
    • 我知道这可能是一个愚蠢的问题,但我是 mongoDB 和 nodeJS 的新手,我似乎无法在我的酒店模型 'var Hot = mongoose.model('Hotel') 上使用聚合函数;'我看到的所有示例都使用 db.collection.aggregate;当我使用 Hot var 进行查询时,我该如何处理?对不起,我是个新手
    • 在你的情况下它应该是 Hot.aggregation([])。里面的数组应该类似于 mongodb 聚合管道。
    【解决方案2】:

    最近我正在处理日期查询。首先,我们需要了解我们如何将日期存储到 mongodb 数据库中。假设我使用 UTC 时间格式存储数据,例如 2020-07-21T09:45:06.567Z。

    我的 json 结构是

    [
    {
        "dateOut": "2020-07-21T09:45:06.567Z",
        "_id": "5f1416378210c50bddd093b9",
        "customer": {
            "isGold": true,
            "_id": "5f0c1e0d1688c60b95360565",
            "name": "pavel_1",
            "phone": 123456789
        },
        "movie": {
            "_id": "5f0e15412065a90fac22309a",
            "title": "hello world",
            "dailyRentalRate": 20
        }
    }
    ]
    

    并且我想执行一个查询,以便我只能获取此(2020-07-21)日期的所有数据。那么我们该如何执行呢?现在我们需要了解基础。

     let result = await Rental.find({
        dateOut: {
            $lt:''+new Date('2020-07-22').toISOString(),
            $gt:''+new Date('2020-07-21').toISOString()
        }
    })
    

    我们需要找到 21 日期的数据,因此我们的查询将大于 21 且小于 22,因为 2020-07-21T00:45:06.567Z , 2020-07-21T01:45:06.567Z .. ... . . 这个时间大于 21 但小于 22。

    【讨论】:

      【解决方案3】:

      var mydate1 = new Date();

      var mydate1 = new Date().getTime();

      ObjectId.getTimestamp()

      Returns the timestamp portion of the ObjectId() as a Date.
      

      例子

      以下示例在 ObjectId() 上调用 getTimestamp() 方法:

      ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

      这将返回以下输出:

      ISODate("2012-10-15T21:26:17Z")

      【讨论】:

        【解决方案4】:

        如果您使用时间戳数据进行查询。 例如:“createdAt”:“2021-07-12T16:06:34.949Z”

        const start  = req.params.id; //2021-07-12
        const data = await Model.find({
                    "createdAt": {
                      '$gte': `${start}T00:00:00.000Z`,
                      '$lt': `${start}T23:59:59.999Z`
                    }
                  });
        console.log(data);
        
        
        

        它将显示特定日期的数据.i.,在这种情况下。 “2021-07-12”

        【讨论】:

          猜你喜欢
          • 2012-10-03
          • 2014-05-09
          • 2020-04-17
          • 2014-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多