根据特定日期和时间从数据池中的 mongo 集合中过滤数据在同一天的不同时间
Posted
技术标签:
【中文标题】根据特定日期和时间从数据池中的 mongo 集合中过滤数据在同一天的不同时间【英文标题】:filter data based on specific day and time from mongo collection from pool of datadifferent time on same day 【发布时间】:2018-01-30 03:53:41 【问题描述】:我有一个用例,我必须从 pymongo 中的 mongo 集合中根据特定日期和该时间之前的任何项目过滤数据
例如:
A- 2018-01-29 10:01:00
B- 2018-01-29 10:11:00
C- 2018-01-29 10:23:00
D- 2018-01-28 11:01:00
E- 2018-01-28 11:04:00
我有过滤键 2018-01-29 10:24:00,那么我只需要返回 A、B 和 C。如果我有过滤键为 2018-01-28 11:05:00,那么我有只返回 D 和 E。如果我有条件 2018-01-29 10:13:00,那么我必须返回 A 和 B。如果我的过滤键为 2018-01-28 11:02:00,那么我只需要返回 D。扩展这一点,另一个条件是如果我的密钥为 2018-01-28 11:02:00,则 CASE A 应返回 D,CASE B 应返回 E。对于密钥 2018-01-29 10:13:00,同样如此, CASE A 应该返回 A 和 B,CASE B 应该只返回 C。
【问题讨论】:
为什么不只传递两个日期作为输入?一个在小时和其他日期的顶部,您可以尝试db.col.find(date:$gte:date1, $lte:date2)
【参考方案1】:
你需要找到所有小于输入时间的记录,也应该是同一时间,你可以试试
searchDate
是日期条件
$date
来自集合
db.col.find(
$expr :
$and :
[
$lte: ["$date", searchDate],
$eq : [ $hour : "$date", $hour : searchDate],
$eq : [ $dayOfMonth : "$date", $dayOfMonth : searchDate],
$eq : [ $month : "$date", $month : searchDate],
$eq : [ $year : "$date", $year : searchDate],
]
)
聚合管道
db.col.aggregate([
$match:
$expr :
$and :
[
$lte: ["$date", searchDate],
$eq : [ $hour : "$date", $hour : searchDate],
$eq : [ $dayOfMonth : "$date", $dayOfMonth : searchDate],
$eq : [ $month : "$date", $month : searchDate],
$eq : [ $year : "$date", $year : searchDate],
]
])
【讨论】:
不是小时,是同一天,小于特定时间(包括小时、分钟和秒) 哦,不幸的是我们没有 trunc 在 mongo 中只获取日期,我们也可以在$and
条件下添加日期月份年份
searchDate 可以是 2018-01-29 10:13:00 或者应该根据小时、月、日等拆分,对于特定的键?用过吗?
@TechJump 应该是ISODate
,您不是将日期存储为ISODate
吗?
如果你有两个日期都是ISODate
s,这将工作以上是关于根据特定日期和时间从数据池中的 mongo 集合中过滤数据在同一天的不同时间的主要内容,如果未能解决你的问题,请参考以下文章
mongo-> 如何从两个不同的集合中获取日期时间 desc 顺序的记录