Node.js/MongoDB - 查询日期

Node.js/MongoDB - querying dates

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

{

    "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 还是returns 空数组。

我真的尝试了所有方法,现在为了简单起见,我只是想让查询与 checkIn 一起工作,这样我就可以弄清楚我做错了什么。我尝试了下面代码的 100 个变体,但我根本无法让它工作。

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

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

提前致谢。

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

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

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

不过提一句忠告,您设计 collection 的方式在长期 运行 中是不可持续的。例如,您尝试 运行 的日期查询将为您提供正确的文档,但不会为您提供每个文档中满足您的日期范围的房间。你必须在服务器端自己做(假设你没有使用聚合)。这将阻止您的服务器处理其他不希望的未决请求。我建议您分解 collection 并将 roomsreservations 分开 collection 以方便查询。

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

这将return以下输出:

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

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

如果您使用时间戳数据进行查询。 例如:“创建时间”:“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”