我试图对一个日期类型的字段应用正则表达式过滤器(年份),但查询没有返回结果。因此,我试图理解这个查询的行为?
db.collection.find({"ReportedDate":/2016/i})
注意:我可以通过日期类型进行筛选而无需使用正则表达式。但我只是想了解正则表达式过滤器对日期类型字段的行为?
$function
操作符编写自定义过滤器,请尝试以下操作:let yearRegex = /2016/i;
db.collection.find({
$expr: {
$function: {
body: function(reportedDate, yearRegex) {
return yearRegex.test(reportedDate);
},
args: [{ $toString: "$ReportedDate" }, yearRegex],
lang: "js"
}
}
});
注意:我们可以使用$dateToString
与timezone
来覆盖边缘情况,而不是使用$toString
。
year
值之外,您还可以利用 MongoDB 聚合管道 来使用 $year 聚合操作符 投影日期对象的年份部分。
例如:db.collection.aggregate([
{"$addFields": {"year": {"$year":"$ReportedDate" } } },
{"$match": {"year": 2016 } }
], {cursor:{batchSize:10}})
还有其他有用的日期相关运算符,如:$dayOfYear,$dayOfWeek,$dayOfMonth等。
我做了同样的事情,但是我使用聚合管道而不是查找方法
db.collection.aggregate(
[
{
$project: {
"d": { $dateToString: {format: "%Y-%m-%d", date: "$mydate"}},key:1
}
} ,
{
$match: {
d: /2012-/i
}
}
]
)
find({"ReportedDate":/.*/})
将仅返回ReportedDate
为字符串的文档。 - Alex Blex