使用Java驱动程序运行准备好的MongoDB查询
问题描述:
我在格式化下面的查询时遇到了问题,可以通过MongoDB Java driver提供的JSON实用程序进行解析,我希望有建议。首先,一些背景。使用Java驱动程序运行准备好的MongoDB查询
测试框架在每次运行结束时将测试结果存储在MongoDB中。 这里有两个这样的样本集“TestResults”:
{
"_id" : ObjectId("SomeId#1"),
"_class" : "com.example.dao.entity.TestResults",
"testScenario" : "Test login",
"runId" : 314,
"runDate" : ISODate("2016-12-14T15:51:04.586Z"),
"status" : "passed"
}
{
"_id" : ObjectId("SomeId#2"),
"_class" : "com.example.dao.entity.TestResults",
"testScenario" : "Test reset password",
"runId" : 314,
"runDate" : ISODate("2016-12-14T20:50:01.269Z"),
"status" : "passed"
}
而且,所谓的“查询”另一个集合包含预先写好的查询模板。下面find
小号文献查询由runDate
:
{
"_id": ObjectId("SomeId#3"),
"_class": "com.example.dao.entity.Query",
"query": "{\"runDate\":{\"$gte\":new Date(\"%1$s\"),\"$lt\":new Date(\"%2$s\")}}"
}
的意图是使用上述查询模板,加入有效的时间范围,在上述“testResults”收集和处理后进一步。以下是我试过到目前为止:
使用JSON.parse()来:
LocalDateTime dateTime1=LocalDateTime.of(2016, 12, 14, 00, 00,00);
LocalDateTime dateTime2 = dateTime1.plusHours(24);
/* Gets date range query from 'Queries' collection */
String dateRange = getDateRangeQuery();
/* Apply time range for last 24 hours... */
dateRange = String.format(dateRange,dateTime1.format(DateTimeFormatter.ISO_DATE_TIME),dateTime2.format(DateTimeFormatter.ISO_DATE_TIME));
BasicDBObject dayQuery=(BasicDBObject) JSON.parse(dateRange);
FindIterable<Document> result = database.getCollection("testResults").find(dayQuery);
result.forEach(new Block<Document>() {
@Override
public void apply(Document t) {
System.out.println("QUERY RESULT:"+t.toJson());
}
});
在运行,JSON.parse()来抛出该异常
com.mongodb.util.JSONParseException:
{"runDate":{"$gte":new Date("2016-12-14T00:00:00"),"$lt":new Date("2016-12-15T00:00:00")}}
^
at com.mongodb.util.JSONParser.read(JSON.java:301)
at com.mongodb.util.JSONParser.parse(JSON.java:172)
at com.mongodb.util.JSONParser.parseObject(JSON.java:263)
at com.mongodb.util.JSONParser.parse(JSON.java:227)
at com.mongodb.util.JSONParser.parseObject(JSON.java:263)
at com.mongodb.util.JSONParser.parse(JSON.java:227)
at com.mongodb.util.JSONParser.parse(JSON.java:155)
at com.mongodb.util.JSON.parse(JSON.java:92)
at com.mongodb.util.JSON.parse(JSON.java:73)
使用BsonDocument .parse():
BsonDocument.parse()
能够解析查询,但我找不到方法配置BsonDocument
的集合名称,然后用于MongoDatabase.runCommand()
那么现在我有什么选择?
答
您需要将查询模板更新为兼容的JSON类型才能解析。
查询模板JSON:
{
"_id": ObjectId("SomeId#3"),
"_class": "com.example.dao.entity.Query",
"query": "{"runDate":{ "$gte" :{"date" : { "$date" : "%1$s"}}}}"
}
代码:
Instant dateTime = Instant.now();
String dateRange = String.format(getDateRangeQuery(),dateTime.toString()));
现在你可以为JSON.parse()
后常规查询运行此。
这里更多其他类型:
https://docs.mongodb.com/manual/reference/mongodb-extended-json/
答
看来,新的日期语法并不在查询的支持,但只在内部JavaScript库。
对于查询,将“new Date”替换为“ISODate”(例如ISODate(“2017-01-10T10:13:58.630Z”))并且它应该正常工作。
查询与[在两个日期之间查找对象MongoDB](http://stackoverflow.com/q/2943222/531762)中找到的查询匹配。我也尝试过使用我自己的数据,它似乎在RoboMongo中为我工作。所以这看起来不像是错误的根源。 – Thunderforge