过滤时间范围 Mongodb

Filter time range in Mongodb

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

的文档的解决方案

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

演示 - 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 ] } } 
        ]
      }, 
    ]
  }
}])

你可以使用这个:

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")
         }
      }
   }
])