使用MongoDB使用时间间隔的最佳方法是什么

时间:2019-12-24 13:42:06

标签: 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_amount: 10,
    license_num: blabla
}

在某个时候,我需要能够以一定的时间间隔对所有停车信息进行分组,这样我就可以计算出一定时间内停车的汽车数量,例如。

使用上面的信息,我需要看到对于这个特定条目,这辆车在我的停车场之间:

  • 2018-01-02 8AM-2018-01-02 9AM
  • 2018-01-02 9AM-2018-01-02 10AM
  • 2018-01-02 10AM-2018-01-02 11am

这样,就有可能计算出之间的停放汽车数量:

  • 2018-01-02 8AM-2018-01-02 9AM
  • 2018-01-02 9AM-2018-01-02 10AM
  • 2018-01-02 10AM-2018-01-02 11am

我的问题是:这是存储信息的最佳方法吗?有没有更好的办法?如何使这种时间间隔查询适合我的情况?

1 个答案:

答案 0 :(得分:0)

  

...能够计算出一定时间内我的汽车数量   停车...

查询基于startend日期时间;这是时间段

然后,通过以下方式获得汽车:

  • {{1}中的check-incheck-outstart
  • {{1}之前的endcheck-in之后的start
  • check-outend之内而check-incheck-out之外
  • start/end在外面,check-incheck-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 } } ] } ] } 的{​​{1}}和in的{​​{1}}用了。

查询参数,时间段,例如:

checkin_date

这些时间是2019年12月25日上午9点至下午5点之间的时间。

以下查询将返回指定时间段内的汽车数量:

out

使用以下checkout_date个条目的测试数据,您将获得var start = "2019-12-25T09:00:00.000+00:00" var end = "2019-12-25T17:00:00.000+00:00" 辆汽车的数量;条目db.parking.find( predicate ).count() 将被排除。

11


  

我的问题是:这是存储信息的最佳方法吗?有没有更好的   办法?如何使这种时间间隔查询适合我的情况?

您存储数据的方式(原样)看起来不错。理想情况下,10_id: 6应该是MongoDB Date字段类型。

上面的示例显示了时间间隔查询。