MongoDB Java实现多字段(System、subsystem)组合去重查询
MongoDB Java实现System与subsystem组合去重查询
方法一:聚合框架(推荐)
通过$group阶段按System和subsystem字段分组,实现组合去重,是性能最优的方案。
依赖准备(Maven)
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.11.1</version> <!-- 替换为最新稳定版 --> </dependency>
Java代码示例
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Projections; import org.bson.Document; import java.util.Arrays; public class MongoCombinedDistinct { public static void main(String[] args) { // 建立MongoDB连接 try (MongoClient client = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase db = client.getDatabase("your_db_name"); // 替换为实际数据库名 MongoCollection<Document> coll = db.getCollection("your_coll_name"); // 替换为实际集合名 // 构建聚合管道 coll.aggregate(Arrays.asList( // 按System和subsystem的组合分组 Aggregates.group(Arrays.asList("$System", "$subsystem"), Projections.fields( Projections.computed("System", "$_id.0"), Projections.computed("subsystem", "$_id.1") )), // 移除自动生成的_id字段 Aggregates.project(Projections.excludeId()) )).forEach(resultDoc -> { // 输出去重后的组合 System.out.printf("System: %s, subsystem: %s%n", resultDoc.getString("System"), resultDoc.getString("subsystem")); }); } } }
代码说明
$group阶段以[System, subsystem]作为分组键,确保只有两个字段完全匹配的文档才会被合并- 通过
Projections.computed从分组ID中提取原始字段,最后移除冗余的_id,返回结构清晰的结果
方法二:distinct简化方案
如果不需要复杂聚合逻辑,可直接用distinct方法获取字段组合的唯一值(MongoDB 3.2+支持):
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; public class MongoDistinctCombined { public static void main(String[] args) { try (MongoClient client = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase db = client.getDatabase("your_db_name"); MongoCollection<Document> coll = db.getCollection("your_coll_name"); // 指定要去重的字段组合 Document distinctFields = new Document("System", 1).append("subsystem", 1); // 查询唯一组合并遍历输出 coll.distinct("", distinctFields, Document.class).forEach(doc -> { System.out.printf("System: %s, subsystem: %s%n", doc.getString("System"), doc.getString("subsystem")); }); } } }
内容的提问来源于stack exchange,提问作者vk l
相关产品推荐
相关产品推荐

