首页 > 解决方案 > 如何使用 MongoDb 的 $gte 和 $lte 将日期和时间保存为单独字段上的字符串

问题描述

我将对象保存在 MongoDb 上,格式如下

{
    ...
    date: (format "dd/MM/yyyy"),
    hour: (format "hh:mm")
    ...
}

我需要找到某个日期和/或某个小时之后的所有内容,例如

db.inventory.find(
    { 
        date: {$gte: "20/03/2019"} 
    })

或者

db.inventory.find(
    {
        hour: {$gte: "15:00"}
    })

或者

db.inventory.find(
    {
        date: {$gte: "20/03/2019"},
        hour: {$gte: "15:00"}
    })

这些不起作用,但这就是查询的想法

标签: mongodbdatetime

解决方案


由于您的日期和时间是字符串以便正确查询,您可以转换为有效日期。

您可以像这样使用带有$project$dateFromString的聚合:

db.inventory.aggregate([
  {
    $project: {
      _id: 0,
      date: {
        $dateFromString: {
          dateString: { $concat: ["$date", "T", "$time"] },
          format: "%d/%m/%YT%H:%M"  // <-- specify the format for the conversion
        }
      }
    }
  },
  {
    $match: {
      date: { $gte: ISODate("2018-03-20") }  // <-- get all after 2018
    }
  }
])

你可以看到它在这里工作

请注意,这$dateFromStringmongo 版本 3.6及更高版本

更新

如果您确实需要查询小时/分钟,则可以使用$dateToParts添加另一个投影:

db.collection.aggregate([
  {
    $project: {
      _id: 0,
      date: {
        $dateFromString: {
          dateString: {
            $concat: ["$date", "T", "$time"]
          },
          format: "%d/%m/%YT%H:%M"
        }
      }
    }
  },
  {
    $project: {
      date: 1,
      parts: { $dateToParts: { date: "$date" }}
    }
  },
  {
    $match: {
      "parts.hour": {
        $gte: 10  // <-- get hours bigger or equal 10
      }
    }
  }
])

你可以玩第二个例子,看看它在这里工作


推荐阅读