【问题标题】:Kotlin Kmongo library with abstract class collection带有抽象类集合的 Kotlin Kmongo 库
【发布时间】:2021-09-04 17:00:44
【问题描述】:

我有这些模型

abstract class Message : Data
data class TextMessage(val m: String): Message
data class ImageMessage(val m: ByteArray): Message

我想通过抽象类Message获取一个集合

database.getCollection<Message>

但它实际上是一个实现类(TextMessage,ImageMes​​sage)实例,具体取决于它的内容

when(val value = collection.findOne()) {
    is TextMessage -> {}
    is ImageMessage -> {}
}

如何做到这一点?

【问题讨论】:

    标签: mongodb kotlin kmongo


    【解决方案1】:

    KMongo 库有 3 个用于对象映射的选项,您的解决方案将取决于使用的是哪一个。

    默认情况下,使用杰克逊引擎。您可以通过向 artifactId 添加 -native 后缀来使用 POJO Codec 引擎,或者通过向 artifactId 添加 -serialization 后缀来使用 Kotlinx 序列化。

    https://litote.org/kmongo/quick-start/#object-mapping-engine

    根据使用的引擎,应用该引擎处理多态性的方式:

    【讨论】:

    • 我已经添加了@BsonDiscriminator注解,并且已经完成了注册编解码器之类的其他事情,但它仍然无法正常工作。 kmongo官网文档对我来说不是很清楚
    • @user16799920 你能分享你的 kmongo 依赖或项目吗?在回答之前,我已经尝试了所有 3 个。 @BsonDiscriminator 仅在您使用 -native 依赖项时才有效。除非Data 类中有我们没有看到的内容,否则不需要注册编解码器。
    • 原来我没有使用 -native 依赖。真的很抱歉我的粗心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多