Mongodb中的过滤时间范围

Posted

技术标签:

【中文标题】Mongodb中的过滤时间范围【英文标题】:Filter time range in Mongodb 【发布时间】:2021-04-20 10:39:24 【问题描述】:

我想获取 MongoDB 中特定 TIME 内的所有文档。我已经搜索过这个,但我只能找到属于特定DATE的文档的解决方案。

例如,我要查找的 SQL 表达式是:WHERE YEAR(date_time) = 2019 AND TIME(date_time) BETWEEN '07:30' AND '08:30'

【问题讨论】:

【参考方案1】:

演示 - https://mongoplayground.net/p/Ny5FCEiQkE7

使用$expr

db.collection.aggregate([
  $match: 
    $expr:  $eq: [  $year: "$dt" , 2021 ] , // match year
    $or: [ // or query
       $and: [ // match hour 7  and minutes 30+
           $expr:  $eq: [  "$hour": "$dt" , 7 ]  ,
           $expr:  $gte: [  "$minute": "$dt" , 30 ]  
        ]
      , 
       $and: [ // match hour 8  and minutes less than 30
           $expr:  $eq: [  "$hour": "$dt" , 8 ]  ,
           $expr:  $lt: [  "$minute": "$dt" , 30 ]   
        ]
      , 
    ]
  
])

【讨论】:

【参考方案2】:

你可以用这个:

db.collection.aggregate([
   
      $addFields: 
         parts: 
            $dateToParts: 
               date: "$date_time" // , timezone : <timezone> if needed
            
         
      
   ,
    $set:  "parts.time":  $sum: [ $multiply: ["$parts.hour", 24] , "$parts.minute"]   ,
   
      $match: 
         "parts.year": 2019,
         "parts.time": 
            $gte:  $sum: [ $multiply: [7, 24] , 30] ,
            $lte:  $sum: [ $multiply: [8, 24] , 30] 
         
      
   
])

另一个解决方案可能是这个:

db.collection.aggregate([
   
      $addFields: 
         time: 
            $dateFromParts: 
               year:  $year: "$date_time" , month: 1, day: 1,
               hour:  $hour: "$date_time" , minute:  $minute: "$date_time" 
               // , timezone : <timezone> if needed
            
         
      
   ,
   
      $match: 
         time: 
            $gte: ISODate("2019-01-01T07:30:00Z"),
            $lte: ISODate("2019-01-01T08:30:00Z")
         
      
   
])

【讨论】:

以上是关于Mongodb中的过滤时间范围的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询

根据日期范围过滤列

日期范围过滤器中的 AND 语句

在spring mongodb中的两个字符串日期范围之间查找

使用 Google 表格中的单个公式从范围创建动态排序和过滤列表

$gte 和 $lte 在 Mongoose/MongoDB 中没有按预期工作