在MongoDB中,如何对日期(ISODate)类型字段应用正则表达式过滤器?

4

我试图对一个日期类型的字段应用正则表达式过滤器(年份),但查询没有返回结果。因此,我试图理解这个查询的行为?

db.collection.find({"ReportedDate":/2016/i})

注意:我可以通过日期类型进行筛选而无需使用正则表达式。但我只是想了解正则表达式过滤器对日期类型字段的行为?


1
筛选器中的数据类型计数。正则表达式仅适用于字符串。对于日期、数字等,它会解析为false。find({"ReportedDate":/.*/})将仅返回ReportedDate为字符串的文档。 - Alex Blex
@AlexBlex 我也是这么想的。感谢确认。 - Sameer
3个回答

2
自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"
        }
    }
});

注意:我们可以使用$dateToStringtimezone来覆盖边缘情况,而不是使用$toString


0
如上所述,$regex query operator 提供了正则表达式功能,用于在查询中匹配模式字符串。
除了使用正则表达式过滤器来查询 year 值之外,您还可以利用 MongoDB 聚合管道 来使用 $year 聚合操作符 投影日期对象的年份部分。 例如:
db.collection.aggregate([
     {"$addFields": {"year": {"$year":"$ReportedDate" } } }, 
     {"$match": {"year": 2016 } }
], {cursor:{batchSize:10}})

还有其他有用的日期相关运算符,如:$dayOfYear$dayOfWeek$dayOfMonth等。


0

我做了同样的事情,但是我使用聚合管道而不是查找方法

db.collection.aggregate(
    [
        {
            $project: {
                "d":  { $dateToString: {format: "%Y-%m-%d", date: "$mydate"}},key:1
            }
        }  ,
        {
            $match: {
                d: /2012-/i
            }
        }
    ]
    )

通过这种方式,我能够在 ISO 日期中应用正则表达式模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接