【问题标题】:Running prepared mongodb queries using Java driver使用 Java 驱动程序运行准备好的 mongodb 查询
【发布时间】:2017-01-23 17:20:58
【问题描述】:

我无法格式化下面的查询,以便MongoDB Java driver 提供的 JSON 实用程序可以解析它,我想要建议。首先,一些上下文。

测试框架在每次运行结束时将测试结果存储在 MongoDB 中。 以下是来自“TestResults”集合的 2 个这样的样本:

{
        "_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"
}

而且,另一个名为“查询”的集合包含预先编写的查询模板。下面的查询finds Documents by 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() 中使用

那么现在我的选择是什么?

【问题讨论】:

  • 该查询与在Find objects between two dates MongoDB 中找到的查询相匹配。我也在我自己的数据上尝试过它,它似乎在 RoboMongo 中对我有用。所以这看起来不像是错误的根源。

标签: java mongodb


【解决方案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/

【讨论】:

    【解决方案2】:

    查询中似乎不支持新的 Date 语法,仅在内部 Javascript 库中支持。

    对于查询,将“新日期”替换为“ISODate”(例如 ISODate("2017-01-10T10:13:58.630Z") ),它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多