如何用MongoDB Java驱动3.6单查询获取指定州ZIP的最值?
解决MongoDB聚合查询对应SQL MIN/MAX的问题
嘿,我来帮你搞定这个MongoDB查询转换的问题!你的需求是把SELECT MIN(ZIP) AS MIN, MAX(ZIP) AS MAX FROM table WHERE BUSINESS_STATE_TERRITORY='Arizona'转换成MongoDB的聚合查询,并且用Java驱动3.6版本实现对吧?
首先,先看MongoDB Shell里的查询写法
你之前的聚合示例是按某个字段分组,但这里SQL没有GROUP BY,所以我们需要把所有符合条件的文档聚合为一个组,核心是把$group的_id设为null:
db.table.aggregate([ // 对应SQL的WHERE条件,过滤出Arizona的记录 { $match: { BUSINESS_STATE_TERRITORY: "Arizona" } }, // 聚合计算MIN和MAX,_id:null表示所有匹配的文档作为一个组 { $group: { _id: null, MIN: { $min: "$ZIP" }, MAX: { $max: "$ZIP" } } } ])
这个管道的逻辑很清晰:先用$match筛选出目标州的文档,再用$group把这些文档合并成一个组,计算ZIP字段的最小和最大值,别名和SQL里的MIN、MAX保持一致。
接下来是Java驱动3.6版本的实现代码
下面是对应Java代码,用官方的同步驱动API实现,注意替换成你实际的数据库名和集合名:
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import static com.mongodb.client.model.Aggregates.*; import static com.mongodb.client.model.Filters.eq; import java.util.Arrays; public class ArizonaZipAggregation { public static void main(String[] args) { // 连接MongoDB,替换成你的连接字符串 try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase db = mongoClient.getDatabase("your_database_name"); MongoCollection<Document> collection = db.getCollection("table"); // 构建$match阶段:过滤BUSINESS_STATE_TERRITORY为Arizona的文档 var matchStage = match(eq("BUSINESS_STATE_TERRITORY", "Arizona")); // 构建$group阶段:计算MIN和MAX ZIP,_id设为null表示全局聚合 var groupStage = group(null, Accumulators.min("MIN", "$ZIP"), Accumulators.max("MAX", "$ZIP")); // 执行聚合查询并处理结果 var results = collection.aggregate(Arrays.asList(matchStage, groupStage)).iterator(); if (results.hasNext()) { Document result = results.next(); System.out.println("最小ZIP: " + result.get("MIN")); System.out.println("最大ZIP: " + result.get("MAX")); } else { System.out.println("没有找到Arizona相关的记录"); } } } }
几个需要注意的点
- 确保你的ZIP字段类型是可比较的:如果ZIP是字符串类型,
$min和$max会按字典序比较,比如"10000"会比"9999"小;如果是数字类型则是数值比较,根据你的实际数据类型调整。 - 依赖配置:如果你用Maven,需要引入3.6版本的MongoDB驱动依赖(同步驱动):
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>3.6.4</version> </dependency> - 替换代码里的
your_database_name和集合名table为你实际的名称。
内容的提问来源于stack exchange,提问作者RolloBallo
相关产品推荐
相关产品推荐

