如何使用MongoDb的$ gte和$ lte作为日期和时间以字符串形式保存在单独的字段中

时间:2019-06-14 14:52:44

标签: mongodb date time

我以这种格式将对象保存在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"}
    })

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

1 个答案:

答案 0 :(得分:1)

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

您可以对$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
    }
  }
])

您可以看到它working here

请注意,$dateFromString mongo 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
      }
    }
  }
])

您可以使用第二个示例,并查看它working here