我在了解如何查询日期方面遇到了一些问题;我认为问题可能出在我的数据结构上。这是我数据库中的示例文档。
{
"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,但不太确定这是什么或如何实现)。
谢谢。
答案 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();
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”