我试图将正则表达式过滤器(年份)应用于日期类型字段,但查询未返回任何结果。那么是想了解这个查询的行为吗?
db.collection.find({"ReportedDate":/2016/i})
注意:我可以按日期类型过滤它而不使用正则表达式。但我只是想了解正则表达式过滤器对日期类型字段的行为?
答案 0 :(得分:0)
如上所述,$regex query operator为查询中的模式匹配字符串提供了正则表达式功能。
使用正则表达式过滤器查询year
值的替代方法,您可以使用MongoDB Aggregation Pipeline使用$year aggregation operator投影日期对象的年份部分。
例如:
db.collection.aggregate([
{"$addFields": {"year": {"$year":"$ReportedDate" } } },
{"$match": {"year": 2016 } }
], {cursor:{batchSize:10}})
还有其他有用的与日期相关的运算符,例如:$dayOfYear,$dayOfWeek,$dayOfMonth等。
答案 1 :(得分:0)
我做了同样的事情,但是我使用聚合管道代替了查找方法
db.collection.aggregate(
[
{
$project: {
"d": { $dateToString: {format: "%Y-%m-%d", date: "$mydate"}},key:1
}
} ,
{
$match: {
d: /2012-/i
}
}
]
)
通过这种方式,我也可以在ISO日期中应用正则表达式模式。
答案 2 :(得分:0)
从 MongoDB 版本 >= 4.4 开始,我们可以使用 $function
运算符编写自定义过滤器,所以试试这个:
let yearRegex = /2016/i;
db.collection.find({
$expr: {
$function: {
body: function(reportedDate, yearRegex) {
return yearRegex.test(reportedDate);
},
args: [{ $toString: "$ReportedDate" }, yearRegex],
lang: "js"
}
}
});
注意:除了 $toString
,我们还可以使用 $dateToString
和 timezone
来覆盖边缘情况。