当前位置: 首页 > 知识库问答 >
问题:

MongoDB ISODate字段搜索使用Java

薛楷
2023-03-14

我在使用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个答案

司马钱明
2023-03-14
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游标,那么这是一个完美的解决方案。

金理
2023-03-14

您正在比较日期,而不是它们的字符串格式。

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

{ "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);
阴宏爽
2023-03-14

由于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);
 类似资料:
  • 如果我想搜索那些名字中包含巴黎的地方,我会做以下操作: 这样我就能看到所有有巴黎这个名字的地方。 然而,我如何能够搜索到其他标准的地方,如 null 在Cloud Firestore中这甚至是可能的吗?如果没有的话,有没有其他方法可以做到这一点?

  • 如何告诉Elasticsearch在按术语搜索时排除某个字段? 当一个普通用户搜索摩托车时,什么都不应该返回,但如果他们搜索史密斯,这两个都应该返回。 有能力搜索认证字段的用户如果搜索摩托车将返回标记,如果搜索史密斯将返回标记。

  • 在弹性搜索中,我将记录存储在命名空间和主题中。这些是简单的对象,只有(string)和。 我想通过自动完成搜索名称,为此我试图使用索引搜索。 ElasticSearch::Transport::Transport::Transport::Errors::BadRequest:[400]{“error”:{“root_cause”:[{“type”:“illegal_argument_excepti

  • 我有一个ISODate格式的“DateAdd”Mongo集合 所以现在是当地时间1小时后 当我尝试获取2018-08-31 06:00:00之后添加的记录时,使用以下查询,我无法获取UTC中的记录 在MongoDB中搜索日期字段时,如何转换UTC日期?

  • 版本字符串有一个支持java类(版本),它实现了Comparable。 我的分析器是一个分析器包装器,它是一个小写和空格分析器,类似于内置的分析器。我使用经典的查询解析器进行搜索。在确切的条件下搜索工作良好。 我想做的是: 我试图在索引之前将版本字符串转换为int,但查询输入需要以某种方式转换,以便在搜索之前将版本字符串转换为int。 看起来我必须为version字段实现一个自定义分析器,但是我在

  • 我有一个endpoint,我正在将它代理到ElasticSearchAPI中,以进行简单的用户搜索。 有关这些参数的一些详细信息如下 所有参数都是可选的 昵称可以作为全文搜索进行搜索(即'myUser'将返回'myUsername') 电子邮件必须完全匹配 名称可以搜索为每个令牌的全文搜索(即'john'将返回'John Smith') ElasticSearch调用应将参数集体视为AND'd。