我需要通过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
提前感谢任何建议!