使用Java

时间:2017-01-25 09:19:34

标签: java mongodb isodate

我在使用Java搜索mongodb中的ISODate字段时遇到问题。我想找到完全匹配的日期。

以下是我查询第一个集合并获取ISODate字段“Timestamp”的方法。一旦我得到这个日期,我想搜索具有相同“时间戳”值的另一个集合。

    FindIterable<Document> docList = thermalComfortCollection.find();
    for(Document doc: docList) {

        String ts = doc.get("Timestamp").toString();
        System.out.println(ts);

...

我正在格式化ISODate,因为它以我想要搜索的其他格式返回日期。因此,我将它转换为这种模式“yyyy-MM-dd HH:mm:ss”

        final DateTimeFormatter inputFormat = 
                DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy");

        // The parsed date
        final ZonedDateTime parsed = ZonedDateTime.parse(ts, inputFormat);

        // The output format
        final DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String date = outputFormat.format(parsed);

我找不到如何为ISODate类型编写完全匹配语句,所以我将gte和lte条件都设置为完全匹配..!

        BasicDBObject query = new BasicDBObject("Timestamp", //
                          new BasicDBObject("$gte", date).append("$lte", date));
                System.out.println(query);

查询无效。你能否给我任何评论我的代码中哪一部分是错的?

3 个答案:

答案 0 :(得分:2)

您正在比较日期而非字符串格式。

例如,要比较下面的时间戳。

{ "timestamp" : ISODate("2017-01-25T09:28:04.041Z") }

代码:

Instant instant = Instant.parse("2017-01-25T09:28:04.041Z"); //Pass your date.

Date timestamp = Date.from(instant);

查询:

Document query = Filters.eq("timestamp", timestamp);

答案 1 :(得分:1)

由于MongoDB使用时区保存UTC中的所有日期,因此您需要在时区设置为UTC的Date实例上进行查询。

这是我在MongoDB中的文档

{ "_id" : ObjectId("58886fa477717752e6eff16b"), "dd" : ISODate("2017-01-25T09:28:04.041Z") }

要从Java查询,我会做:

String dateStr = "2017-01-25 09:28:04.041 UTC";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ZZZ").parse(dateStr);
BasicDBObject filter = new BasicDBObject("dd", date);
coll.find(filter);

答案 2 :(得分:0)

Instant instant = Instant.parse("2017-01-25T09:28:04.041Z"); // Pass your date.
Date timestamp = Date.from(instant);
Document query = Filters.eq("timestamp", timestamp);

如果您使用的是JAVA编程的Mongo Cursor,则为完美解决方案。