使用MongoDB处理时间间隔的最佳方法是什么
我正在处理一些与MongoDB相关的查询(或建模)。 我正在从SQL数据库迁移到MongoDB。 到目前为止还不错,但有一个棘手的问题我找不到一个好的解决方案 我现在在我的停车收藏中有以下结构使用MongoDB处理时间间隔的最佳方法是什么,mongodb,Mongodb,我正在处理一些与MongoDB相关的查询(或建模)。 我正在从SQL数据库迁移到MongoDB。 到目前为止还不错,但有一个棘手的问题我找不到一个好的解决方案 我现在在我的停车收藏中有以下结构 { _id: 5e00f403a663466329c78c5a, checkin_date: "2018-01-02T08:43:20.000+00:00", checkout_date: "2018-01-02T11:07:16.000+00:00", fare_amou
{
_id: 5e00f403a663466329c78c5a,
checkin_date: "2018-01-02T08:43:20.000+00:00",
checkout_date: "2018-01-02T11:07:16.000+00:00",
fare_amount: 10,
license_num: blabla
}
在某些情况下,我需要能够以时间间隔的方式对所有停车信息进行分组,以便能够计算特定时间段内停车场的车辆数量,例如
使用上面的信息,我需要看到,对于这个特定条目,这辆车在我的停车场之间:
- 2018-01-02上午8点至2018-01-02上午9点
- 2018-01-02上午9点至2018-01-02上午10点
- 2018-01-02上午10点至2018-01-02上午11点
- 2018-01-02上午8点至2018-01-02上午9点
- 2018-01-02上午9点至2018-01-02上午10点
- 2018-01-02上午10点至2018-01-02上午11点
开始
和结束
日期时间;这是一段时间
然后,使用以下工具获取车辆:
和入住
在退房
和开始
结束
入住前
开始
和
退房后
结束
在内部,check-in
在外部check-out
start/end
在外面,而check-in
在check-out
start/end
var predicate = { $or: [
{ $and: [ { in: { $gte: start } }, { out: { $lte: end } } ] },
{ $and: [ { in: { $lt: start } }, { out: { $gt: end } } ] },
{ $and: [ { in: { $gte: start } }, { in: { $lte: end } }, { out: { $gt: end } } ] },
{ $and: [ { in: { $lt: start } }, { out: { $gte: start } }, { out: { $lte: end } } ] }
] }
注:为简洁起见,我使用了in
表示checkin\u date
和out
表示checkout\u date
查询参数、时间段,例如:
var start = "2019-12-25T09:00:00.000+00:00"
var end = "2019-12-25T17:00:00.000+00:00"
这是2019年12月25日上午9点到下午5点之间的时间
以下查询将返回指定时间段内的车辆数量:
db.parking.find( predicate ).count()
使用以下11
条目的测试数据,您将获得10
辆车的计数;条目\u id:6
将被排除在外
{ "_id" : 1, "veh" : "car-1", "in" : "2019-12-25T08:00:00.000+00:00", "out" : "2019-12-25T10:00:00.000+00:00" }
{ "_id" : 2, "veh" : "car-3", "in" : "2019-12-25T13:00:00.000+00:00", "out" : "2019-12-25T14:00:00.000+00:00" }
{ "_id" : 3, "veh" : "car-4", "in" : "2019-12-25T13:00:00.000+00:00", "out" : "2019-12-25T15:00:00.000+00:00" }
{ "_id" : 4, "veh" : "car-5", "in" : "2019-12-25T14:00:00.000+00:00", "out" : "2019-12-25T16:00:00.000+00:00" }
{ "_id" : 5, "veh" : "car-4", "in" : "2019-12-25T14:00:00.000+00:00", "out" : "2019-12-25T18:00:00.000+00:00" }
{ "_id" : 6, "veh" : "car-0", "in" : "2019-12-25T06:00:00.000+00:00", "out" : "2019-12-25T08:00:00.000+00:00" }
{ "_id" : 7, "veh" : "car-1", "in" : "2019-12-25T17:00:00.000+00:00", "out" : "2019-12-25T18:00:00.000+00:00" }
{ "_id" : 8, "veh" : "car-9", "in" : "2019-12-25T12:00:00.000+00:00", "out" : "2019-12-25T12:00:00.000+00:00" }
{ "_id" : 9, "veh" : "car-x", "in" : "2019-12-25T17:00:00.000+00:00", "out" : "2019-12-26T01:00:00.000+00:00" }
{ "_id" : 10, "veh" : "car-y", "in" : "2019-12-24T12:00:00.000+00:00", "out" : "2019-12-25T12:00:00.000+00:00" }
{ "_id" : 11, "veh" : "car-z", "in" : "2019-12-25T08:00:00.000+00:00", "out" : "2019-12-25T22:00:00.000+00:00"}
我的问题是:这是存储信息的最佳方式吗?有更好的方法吗 路?我怎样才能使这个时间间隔查询适用于我的案例 您存储数据的方式(按原样)看起来不错。理想情况下,
checkin\u date
和checkout\u date
应该是字段类型
上面的示例显示了时间间隔查询
。。。能够在我的电脑上计算一定时间内的汽车数量
停车场
查询基于开始
和结束
日期时间;这是一段时间
然后,使用以下工具获取车辆:
和入住
在退房
和开始
结束
入住前
开始
和
退房后
结束
在内部,check-in
在外部check-out
start/end
在外面,而check-in
在check-out
start/end
var predicate = { $or: [
{ $and: [ { in: { $gte: start } }, { out: { $lte: end } } ] },
{ $and: [ { in: { $lt: start } }, { out: { $gt: end } } ] },
{ $and: [ { in: { $gte: start } }, { in: { $lte: end } }, { out: { $gt: end } } ] },
{ $and: [ { in: { $lt: start } }, { out: { $gte: start } }, { out: { $lte: end } } ] }
] }
注:为简洁起见,我使用了in
表示checkin\u date
和out
表示checkout\u date
查询参数、时间段,例如:
var start = "2019-12-25T09:00:00.000+00:00"
var end = "2019-12-25T17:00:00.000+00:00"
这是2019年12月25日上午9点到下午5点之间的时间
以下查询将返回指定时间段内的车辆数量:
db.parking.find( predicate ).count()
使用以下11
条目的测试数据,您将获得10
辆车的计数;条目\u id:6
将被排除在外
{ "_id" : 1, "veh" : "car-1", "in" : "2019-12-25T08:00:00.000+00:00", "out" : "2019-12-25T10:00:00.000+00:00" }
{ "_id" : 2, "veh" : "car-3", "in" : "2019-12-25T13:00:00.000+00:00", "out" : "2019-12-25T14:00:00.000+00:00" }
{ "_id" : 3, "veh" : "car-4", "in" : "2019-12-25T13:00:00.000+00:00", "out" : "2019-12-25T15:00:00.000+00:00" }
{ "_id" : 4, "veh" : "car-5", "in" : "2019-12-25T14:00:00.000+00:00", "out" : "2019-12-25T16:00:00.000+00:00" }
{ "_id" : 5, "veh" : "car-4", "in" : "2019-12-25T14:00:00.000+00:00", "out" : "2019-12-25T18:00:00.000+00:00" }
{ "_id" : 6, "veh" : "car-0", "in" : "2019-12-25T06:00:00.000+00:00", "out" : "2019-12-25T08:00:00.000+00:00" }
{ "_id" : 7, "veh" : "car-1", "in" : "2019-12-25T17:00:00.000+00:00", "out" : "2019-12-25T18:00:00.000+00:00" }
{ "_id" : 8, "veh" : "car-9", "in" : "2019-12-25T12:00:00.000+00:00", "out" : "2019-12-25T12:00:00.000+00:00" }
{ "_id" : 9, "veh" : "car-x", "in" : "2019-12-25T17:00:00.000+00:00", "out" : "2019-12-26T01:00:00.000+00:00" }
{ "_id" : 10, "veh" : "car-y", "in" : "2019-12-24T12:00:00.000+00:00", "out" : "2019-12-25T12:00:00.000+00:00" }
{ "_id" : 11, "veh" : "car-z", "in" : "2019-12-25T08:00:00.000+00:00", "out" : "2019-12-25T22:00:00.000+00:00"}
我的问题是:这是存储信息的最佳方式吗?有更好的方法吗 路?我怎样才能使这个时间间隔查询适用于我的案例 您存储数据的方式(按原样)看起来不错。理想情况下,
checkin\u date
和checkout\u date
应该是字段类型
上面的示例显示了时间间隔查询。请将datetime保存在timestampI中我发布了答案。它有用吗?嘿,伙计们,谢谢你们的帮助(对不起,我正在度假,刚刚看到了答案)。他们帮了我很多@prasad_uuu试图提升你的答案,但我似乎没有足够的声誉:(无论如何,谢谢!我的答案回答了你的问题吗?请看这个:请在时间内保存datetime我发布了答案。有用吗?嘿,伙计们,谢谢你的帮助(对不起,我正在度假,刚刚看到了答案).他们帮了我很大的忙@prasad_uu试图提高你的回答,但我似乎没有足够的声誉:(无论如何,谢谢!我的回答回答了你的问题吗?请看以下: