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 并将 rooms 和 reservations 分开 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”
我在理解如何查询日期时遇到了一些问题;我认为问题可能出在我的数据结构上。这是我的数据库中的示例文档。
{
"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 并将 rooms 和 reservations 分开 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”