日期范围查询 mongodb

Posted

技术标签:

【中文标题】日期范围查询 mongodb【英文标题】:Date range queries mongodb 【发布时间】:2015-07-17 03:41:06 【问题描述】:

我有两个收藏,一个是random,另一个是'msg'

在消息中我有一个类似

的文档
 "message": "sssss", postedAt: Fri Jul 17 2015 09:03:43 GMT+0530 (IST) 

对于随机收集,有一个脚本每分钟生成一次随机数

喜欢

  "randomStr": "sss", postedAt: Fri Jul 17 2015 09:03:43 GMT+0530 (IST) 
  "randomStr": "xxx", postedAt: Fri Jul 17 2015 09:04:43 GMT+0530 (IST) 
  "randomStr": "yyy", postedAt: Fri Jul 17 2015 09:05:43 GMT+0530 (IST) 

注意时间的变化,每分钟都有一个新记录。

现在,我的问题是

当我查询message 集合时,我会得到一条记录。

让我们这么说

 "message": "sssss", postedAt: Fri Jul 17 2015 09:03:13 GMT+0530 (IST) 

现在我想从random 集合中获取记录,该集合在准确的时间发布

此消息发布在09:03,我想从random 集合中获取记录,该集合在同一时间发布09:03

如何做到这一点?任何帮助表示赞赏。谢谢。

注意:我在meteor中做这个

编辑

为第一条评论添加了图片

【问题讨论】:

不是这么简单吗? db.random.find("postedAt" : $date ); @gastonmancini,如果秒数不同,则无法正常工作,请添加图像作为有问题的证据。谢谢回复 【参考方案1】:

所以这里的重点是“实际使用一个范围”,并且还要注意你得到的 Date 值作为回报。所以原则上作为一个基本的例子。

现在执行此操作的时间是:

var date = new Date()
ISODate("2015-07-17T04:02:04.471Z")

因此,如果您假设文档中的实际时间戳“不精确到分钟”(如上),“随机记录”也不太可能如此,那么首先要做的是将其“四舍五入”到分钟:

date = new Date(date.valueOf() - date.valueOf() % ( 1000 * 60 ))
ISODate("2015-07-17T04:02:00Z")

当然,“结束日期”只是在那之后的一分钟:

var endDate = new Date(date.valueOf() + ( 1000 * 60 ))
ISODate("2015-07-17T04:03:00Z")

然后,当您查询“rqndom”时,您只会得到“范围”,使用$gte$lt 运算符:

db.random.find( "postedAt":  "$gte": date, "$lt": endDate  )

这只是在那一分钟内以任何可能的值从“随机”中检索您的单个“每分钟写入一次”项目。

所以基本上:

将您输入的检索日期四舍五入到分钟 搜索该值与下一分钟之间的“范围”

【讨论】:

谢谢答案,我会试试这个,我有同样的想法,但认为如果我们更改日期值,我们可能会丢失日期对象引用,我们会丢失吗? @noName 取决于你做什么。您始终可以使用检索到的文档中源中的“四舍五入”值转换为新变量,如图所示。这可能是最安全的事情。您可以执行其他方法来操作检索到的日期值,但我没有在这里展示。

以上是关于日期范围查询 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

sql 查询时间、日期范围内的数据

如何设置包含当前日期的日期范围的 BigQuery 查询

按日期范围查询 Firestore

SQL 如何查询日期在一定范围内的数据

SQL 查询日期范围保存在 2 列中

Mysql查询 - 返回两个日期范围相交的日期