You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取MongoDB中时间戳/指定字段值相同的记录?含RESTHeart+Java实现

解答:结合RESTHeart在Java中查询MongoDB集合的重复值记录

嘿,刚接触应用端开发别慌,我来一步步帮你搞定这两个问题——毕竟RESTHeart结合MongoDB的查询语法确实需要一点点上手时间,咱们慢慢拆解:

1. 获取具有相同epoch timestamp的所有记录

首先,RESTHeart是通过filterURI参数来传递MongoDB查询条件的,本质上就是把MongoDB的查询文档转成URL编码后的字符串。

步骤说明:

  • 假设你的epoch时间戳字段名为epoch_ts,要查询所有值等于1620000000的记录,对应的MongoDB查询文档是:
    {"epoch_ts": 1620000000}
    
  • 把这个JSON字符串做URL编码(因为URI里不能直接包含{}、:这类特殊字符),编码后会变成:
    %7B%22epoch_ts%22%3A+1620000000%7D
    
  • 然后拼接到RESTHeart的集合请求URL后面,完整的请求地址大概是:
    http://your-restheart-host:8080/your-db/your-collection?filter=%7B%22epoch_ts%22%3A+1620000000%7D
    

Java代码示例(用Java 11+ HttpClient):

import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class RestHeartQueryExample {
    public static void main(String[] args) throws Exception {
        // 1. 定义查询条件
        String epochValue = "1620000000";
        String filterJson = String.format("{\"epoch_ts\": %s}", epochValue);
        // URL编码过滤条件
        String encodedFilter = URLEncoder.encode(filterJson, StandardCharsets.UTF_8);

        // 2. 构造RESTHeart请求URL
        String restHeartUrl = "http://your-restheart-host:8080/your-db/your-collection?filter=" + encodedFilter;

        // 3. 发送GET请求
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(restHeartUrl))
                // 如果RESTHeart需要认证,这里加Authorization头,比如Basic Auth
                // .header("Authorization", "Basic " + Base64.getEncoder().encodeToString("user:pass".getBytes()))
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("查询结果:" + response.body());
    }
}

2. 获取具有相同"interesting_date"值的所有记录

这个逻辑和第一个问题完全一致,只是把字段名换成interesting_date。需要注意的是,如果interesting_date是MongoDB的ISODate类型,查询时要使用$date语法:

步骤说明:

  • 假设要查询的日期是2021-05-03,对应的MongoDB查询文档是:
    {"interesting_date": {"$date": "2021-05-03T00:00:00Z"}}
    
  • URL编码后变成:
    %7B%22interesting_date%22%3A+%7B%22%24date%22%3A+%222021-05-03T00%3A00%3A00Z%22%7D%7D
    
  • 完整请求URL:
    http://your-restheart-host:8080/your-db/your-collection?filter=%7B%22interesting_date%22%3A+%7B%22%24date%22%3A+%222021-05-03T00%3A00%3A00Z%22%7D%7D
    

Java代码示例(调整过滤条件即可):

import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class RestHeartDateQueryExample {
    public static void main(String[] args) throws Exception {
        // 1. 定义目标日期(注意要符合ISODate格式)
        String targetDate = "2021-05-03T00:00:00Z";
        String filterJson = String.format("{\"interesting_date\": {\"$date\": \"%s\"}}", targetDate);
        String encodedFilter = URLEncoder.encode(filterJson, StandardCharsets.UTF_8);

        // 2. 构造请求URL
        String restHeartUrl = "http://your-restheart-host:8080/your-db/your-collection?filter=" + encodedFilter;

        // 3. 发送请求(和第一个示例的请求逻辑一致)
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(restHeartUrl))
                // 按需添加认证头
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("日期查询结果:" + response.body());
    }
}

额外小提示:

  • 如果RESTHeart启用了认证,记得在请求头里加上对应的Authorization信息(比如Basic Auth的编码字符串)。
  • 测试的时候可以先用Postman之类的工具手动构造请求,确认能拿到正确结果后再转成Java代码,这样更容易排查问题。

内容的提问来源于stack exchange,提问作者user3243499

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:15:07