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

如何在Kmongo的MongoRepo中获取新记录ID且不修改函数结构?

解决方案

要获取MongoDB文档的原生_id作为Item的ID,你可以借助MongoDB Kotlin驱动提供的BsonDocumentWrapper工具类,将泛型实体转换为底层的BsonDocument,从而直接读取_id字段值,无需修改函数结构或存储外部变量。

修改后的read方法代码如下:

import org.bson.BsonDocumentWrapper
import org.bson.types.ObjectId

class MongoRepo<E>(private val collection: MongoCollection<E>) : Repo<E> {

    override fun create(element: E): Boolean {
        collection.insertOne(element)
        return true
    }

    override fun read(): List<Item<E>> {
        return collection.find().map { element ->
            // 将泛型实体转换为BsonDocument,获取底层Mongo文档结构
            val bsonDocument = BsonDocumentWrapper.asBsonDocument(element, collection.codecRegistry)
            // 获取Mongo生成的_id并转换为十六进制字符串
            val recordId = bsonDocument.getObjectId("_id").toHexString()
            Item(recordId, element)
        }.toList()
    }
}

关键说明

  • BsonDocumentWrapper.asBsonDocument:该方法利用集合的编解码器注册表(codecRegistry),将泛型实体实例序列化为BsonDocument,让你能直接访问MongoDB文档的所有字段,包括自动生成的_id。
  • getObjectId("_id"):默认情况下MongoDB会为插入的文档生成ObjectId类型的_id,调用此方法可获取该值,再通过toHexString()转换为常用的字符串格式。
  • 兼容性:此方式不依赖实体类E是否显式定义了_id属性,无论实体是用数据类映射还是匿名文档,都能正确提取Mongo原生ID。

如果你的场景中_id不是ObjectId类型(比如自定义了字符串ID),可以将获取逻辑调整为:

val recordId = bsonDocument.get("_id").toString().removeSurrounding("\"")

内容的提问来源于stack exchange,提问作者Denis Popkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:05:26