mongodb - 如何使用 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"}
})
这些不起作用,但这就是查询的想法
解决方案
由于您的日期和时间是字符串以便正确查询,您可以转换为有效日期。
您可以像这样使用带有$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
}
}
])
你可以看到它在这里工作
请注意,这$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
}
}
}
])
你可以玩第二个例子,看看它在这里工作
推荐阅读
- python - python 2.7 中的 os.path.join 有什么作用?
- mysql - mysql json查询对布尔值的行为很有趣
- python - 如何在 cnn 之上添加 svm 作为最终分类器?
- r - 在 dplyr 中重新编码,给出错误:参数 2 必须命名,而不是未命名
- excel - Excel中工作表的参数平均值
- shell - 如何在 shell 脚本中使用 awk 构建变量
- java - Spring Boot Data JPA Paging 以正确的方式实现
- macos - Mamp:导入大型数据库
- python - 用 Python 解决 XML 问题
- sql - 如何创建具有重复特定次数的值的列