如何获取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
相关产品推荐
相关产品推荐

