2017-01-23 135 views
2

我在格式化下面的查詢時遇到了問題,可以通過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()

那麼現在我有什麼選擇?

+0

查詢與[在兩個日期之間查找對象MongoDB](http://stackoverflow.com/q/2943222/531762)中找到的查詢匹配。我也嘗試過使用我自己的數據,它似乎在RoboMongo中爲我工作。所以這看起來不像是錯誤的根源。 – Thunderforge

回答

1

您需要將查詢模板更新爲兼容的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/

0

看來,新的日期語法並不在查詢的支持,但只在內部JavaScript庫。

對於查詢,將「new Date」替換爲「ISODate」(例如ISODate(「2017-01-10T10:13:58.630Z」))並且它應該正常工作。

相關問題