通过db.runCommand()进行MongoDB聚合:$按日期匹配

时间:2018-05-22 19:21:10

标签: mongodb

我需要通过db.runCommand()在“严格JSON”模式下执行的聚合查询中按日期匹配文档。这些要求由the way JasperReports communicates with MongoDB

决定

文件架构:

{ 
    "_id" : ObjectId("5a6fca214420c2302a6f8985"), 
    "report_date" : ISODate("2018-01-23T00:00:00.000+0000"), 
    ...
}

这适用于MongoDB控制台(返回匹配的文档),但它在JasperReports中不起作用(在包含“ISODate()”命令的行中抛出com.mongodb.util.JSONParseException)。为清晰起见,我只展示了管道的第一阶段:

db.runCommand(
{
    "aggregate" : "reports",
    "pipeline" : [
        {
            "$match": {
                "report_date": {
                    "$gte": ISODate("2017-01-23")
                }
            }
        }
    ],
    "cursor": {}
})

使用$date的相同查询在MongoDB和JasperReports中执行良好,但不返回任何文档(在两种情况下都匹配0):

db.runCommand(
{
    "aggregate" : "reports",
    "pipeline" : [
        {
            "$match": {
                "report_date": {
                    "$gte": {"$date": "2017-01-23T00:00:00.000Z"}
                }
            }
        }
    ],
    "cursor": {}
})

以下是第二个查询的响应示例:

{
    "cursor" : {
        "firstBatch" : [ ],
        "id" : NumberLong(0),
        "ns" : "reports"
    },
    "ok" : 1
}

我在范围查询中观察到相同的行为,如下面的代码段所示:

...
"$gte": {"$date": "2017-01-29T00:00:00.000Z"},
"$lt": {"$date": "2019-01-29T00:00:00.000Z"}
...

我也尝试使用$dateFromString而不是$date(有趣的是,在MongoDB 3.2中使用这个不会导致抛出任何异常) - 结果相同。

如何在聚合管道和严格JSON模式的“匹配”阶段按日期或日期范围运行查询?

经过测试的版本:MongoDB 3.2.12和3.6.2,JasperReports Studio:6.5.1 final

提前感谢任何建议!

0 个答案:

没有答案