Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MongoDB处理时间间隔的最佳方法是什么_Mongodb - Fatal编程技术网

使用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

我正在处理一些与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_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试图提高你的回答,但我似乎没有足够的声誉:(无论如何,谢谢!我的回答回答了你的问题吗?请看以下: