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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:14:11