使用Java搜索MongoDB的ISODate字段

3

我在使用Java查询mongodb中的ISODate字段时遇到了困难。我想要精确匹配日期。

以下是我如何查询第一个集合并获取ISODate字段“Timestamp”的方法。一旦我获得了这个日期,我就想使用相同的“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个回答

5

由于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);

谢谢!我在我的代码中发现了一个问题,那是因为我没有正确地使用日期筛选器。 - ejshin1

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);

如果我使用这段代码,它会抛出一个错误:_java.time.format.DateTimeParseException: Text 'Wed Dec 21 05:45:00 PST 2016' could not be parsed at index 0_。 - ejshin1
你是将日期作为字符串输入吗?看起来你的日期时间带有时区。解析为 ZonedDateTime - Instant - Date - s7vr
我最初将日期作为字符串。它应该是日期结构,明白了,谢谢! - ejshin1

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,这是一个完美的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接