如何在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
相关产品推荐
相关产品推荐

