Node.js / MongoDB-查询日期

时间:2019-01-06 02:15:28

标签: node.js mongodb mongoose mongoose-schema

我在了解如何查询日期方面遇到了一些问题;我认为问题可能出在我的数据结构上。这是我数据库中的示例文档。

{

    "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,但不太确定这是什么或如何实现)。

谢谢。

4 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

最近我正在研究日期查询。首先,我们需要了解如何将日期存储到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。

答案 2 :(得分:0)

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”)

答案 3 :(得分:0)

如果您使用时间戳数据进行查询。 EG:“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.,e 的数据。 “2021-07-12”