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

如何在Kotlin中从MongoDB获取数据并实现聚合管道?

Kotlin中MongoDB聚合管道实现思路

我正尝试了解如何在Kotlin中从MongoDB获取数据并执行聚合管道操作,但找不到相关资料或教程,自己写代码也没法准确实现,求思路。

现有数据获取函数示例

fun main() {
    val client = getMongoClient()
    val database = client.getDatabase("<database>")
    val collection = database.getCollection("<collection>")

    val documents = fetchDataFromMongoDB(collection)

    for (document in documents) {
        println(document.toJson())
    }

    client.close()
}

当前依赖项

// Mongo Realm
implementation ("io.realm.kotlin:library-sync:1.13.0")

// Hilt
implementation ("androidx.hilt:hilt-navigation-compose:1.1.0")

// Desugar JDK
coreLibraryDesugaring ("com.android.tools:desugar_jdk_libs:2.0.4")

// Message Bar Compose
implementation ("com.github.stevdza-san:MessageBarCompose:1.0.5")

可运行的打包配置

excludes += "/META-INF/proguard/androidx-annotations.pro"
excludes += "META-INF/native-image/**"

聚合管道实现思路

1. 构建聚合阶段

MongoDB聚合管道由多个逻辑阶段组成,比如$match(过滤)、$group(分组)、$sort(排序)等。在Kotlin中,你可以用Document类逐个定义每个阶段的规则。

2. 执行聚合操作

调用MongoDB集合的aggregate()方法,传入阶段列表即可执行聚合计算,最后遍历结果集处理数据。

示例代码

比如实现“统计活跃状态下各分类的文档数量,并按数量降序排列”的聚合逻辑:

fun runAggregation(collection: MongoCollection<Document>) {
    // 定义聚合阶段列表
    val stages = listOf(
        // 阶段1:只保留status为"active"的文档
        Document("\$match", Document("status", "active")),
        // 阶段2:按category分组,统计每组文档数
        Document("\$group", Document("_id", "\$category").append("count", Document("\$sum", 1))),
        // 阶段3:按count字段降序排序
        Document("\$sort", Document("count", -1))
    )

    // 执行聚合并获取结果
    val aggregationResult = collection.aggregate(stages)

    // 遍历输出结果
    aggregationResult.forEach { result ->
        println("分类: ${result["_id"]}, 文档数量: ${result["count"]}")
    }
}

3. 整合到现有代码

将聚合函数加入你的main函数即可运行:

fun main() {
    val client = getMongoClient()
    val database = client.getDatabase("<database>")
    val collection = database.getCollection("<collection>")

    // 执行聚合操作
    runAggregation(collection)

    client.close()
}

关键注意事项

  • 聚合阶段的关键字(如$match)需要在Kotlin字符串中转义,写成"\$match",或者使用Kotlin原生字符串"""$match"""避免转义。
  • 如果你用的是Realm Kotlin SDK,也可以用更贴合Kotlin风格的DSL来构建聚合,示例如下:
// Realm Kotlin SDK聚合DSL示例
val aggregationResult = collection.query()
    .match(Query.equalTo("status", "active"))
    .groupBy("_id", "\$category")
    .sum("count", 1)
    .sort("count", Sort.DESCENDING)
    .find()

// 遍历结果
aggregationResult.forEach {
    println("分类: ${it._id}, 数量: ${it.count}")
}

内容的提问来源于stack exchange,提问作者Josef M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:46:39