2017-01-23 2 views
2

У меня возникли проблемы с форматированием запроса ниже, чтобы он мог анализировать утилиту JSON, предоставленную MongoDB Java driver, и я хотел бы предложить предложения. Во-первых, некоторый контекст.Выполнение подготовленных запросов mongodb с использованием драйвера Java

Испытательная основа, в конце каждого прогона, хранит результаты испытаний в MongoDB. Вот 2 такие образцы из коллекции «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 библиотек.

Для запроса замените «новую дату» на «ISODate» (например, ISODate («2017-01-10-1010: 13: 58.630Z»)), и он должен работать.

Смежные вопросы