如何在Java中实现指定的MongoDB聚合查询语句?
解决Java实现MongoDB聚合查询的问题
我来帮你搞定这个Java实现MongoDB聚合的需求!你的思路方向是对的,不过在正则表达式的写法上有点小误区,咱们一步步修正并完成完整代码:
首先先明确你要实现的原MongoDB shell查询:
db.wordsRank.aggregate([ {$match: {word: {$regex:/engin/i} } }, {$sort:{rank:-1} } ])
问题点说明
你之前写的regQuery.append("$regex", "/" + "engin" + "/i");是错误的——MongoDB Java驱动里不需要用/包裹正则表达式,也不用把i(不区分大小写)写在regex值里,而是要单独通过$options参数来指定,或者用驱动提供的工具类更省心。
完整实现方案
这里给你两种写法,你可以根据习惯选择:
写法1:手动构建Document管道(延续你的原始思路)
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import java.util.Arrays; public class WordsRankAggregate { 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("wordsRank"); // 构建$match阶段:修正正则查询的写法 Document regexCondition = new Document("$regex", "engin") .append("$options", "i"); // 指定不区分大小写 Document matchStage = new Document("$match", new Document("word", regexCondition)); // 构建$sort阶段:按rank降序排列 Document sortStage = new Document("$sort", new Document("rank", -1)); // 执行聚合并遍历结果 collection.aggregate(Arrays.asList(matchStage, sortStage)) .forEach(resultDoc -> System.out.println(resultDoc.toJson())); } } }
写法2:使用驱动工具类(更简洁易读)
MongoDB Java驱动提供了Aggregates和Filters工具类,能让代码更直观,减少手动构建Document的繁琐:
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import org.bson.Document; import java.util.Arrays; public class WordsRankAggregate { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase db = mongoClient.getDatabase("your_database_name"); MongoCollection<Document> collection = db.getCollection("wordsRank"); // 用工具类快速构建聚合管道 collection.aggregate(Arrays.asList( Aggregates.match(Filters.regex("word", "engin", "i")), Aggregates.sort(Sorts.descending("rank")) )).forEach(resultDoc -> System.out.println(resultDoc.toJson())); } } }
关键注意事项
- 记得替换代码中的
mongodb://localhost:27017和your_database_name为你实际的MongoDB连接信息和数据库名称。 - 如果你的驱动版本较旧,可能需要调整导入路径,但核心逻辑是一致的。
内容的提问来源于stack exchange,提问作者Hager Hosny
相关产品推荐
相关产品推荐

