如何将正则表达式过滤器应用于mongodb中的日期(isodate)类型字段

时间:2018-01-05 11:19:51

标签: mongodb isodate

我试图将正则表达式过滤器(年份)应用于日期类型字段,但查询未返回任何结果。那么是想了解这个查询的行为吗?

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

注意:我可以按日期类型过滤它而不使用正则表达式。但我只是想了解正则表达式过滤器对日期类型字段的行为?

3 个答案:

答案 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,我们还可以使用 $dateToStringtimezone 来覆盖边缘情况。