首页 > 解决方案 > 无法使用 Morphia (MongoDB) 查询嵌套对象

问题描述

我正在使用 Morphia 2.0.2,我正在尝试查询我刚刚保存但没有成功的文档。现在我已经在 Atlas 集群版本 3.6.20 和 4.2.10 上对此进行了测试,但都没有成功。

在这里您可以找到涉及的对象:

@Entity("employees")
data class Employee (
    @Id
    var _id: String? = ObjectId().toString(),
    @Indexed
    var name: String? = null,
    @Indexed
    var foos: MutableList<Foo>? = mutableListOf()
)

data class Foo (
        @Indexed
        var test: String? = null
)

我已经以这种方式初始化了数据存储,因为我也遇到了类编解码器的问题Foo

// In order to avoid the "Can't find a codec for class com.test.morphia.data.Foo." error
val connectionString = ConnectionString("mongodb+srv://$username:$password@$url/$dbname?retryWrites=true&w=majority")
val pojoCodecRegistry: CodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build())
val codecRegistry: CodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry)
val clientSettings = MongoClientSettings.builder()
        .applyConnectionString(connectionString)
        .codecRegistry(codecRegistry)
        .build()
val mongoClient = MongoClients.create(clientSettings)
val dataStore = Morphia.createDatastore(mongoClient, dbname)
dataStore.mapper.mapPackage("com.test.morphia.data")
dataStore.ensureIndexes()

然后我保存一个文档并尝试在 foo 对象上查询它:

val employee = Employee(
            name = "Marco",
            foos = mutableListOf(Foo("test1"), Foo("test2"))
            )
dataStore.save(employee)
val result = dataStore.find(Employee::class.java)
            .filter(
                    Filters.eq("foos.test", "test1")
            )

执行查询时,我收到此错误:

“无法针对 'com.test.morphia.data.Employee' 解析路径 'foos.test'。”

我应该如何以这种方式查询数据库?我试图查看示例、参考和存储库,但我还没有找到有关如何执行此操作的示例。

编辑:这是文档在 MongoDB 中的外观:

{
    "_id":"5f998da6bb8014090ae22549",
    "foos":[
        {"test":"test1"},
        {"test":"test2"}
    ],
    "name":"Marco"
}

标签: javamongodbkotlinmorphia

解决方案


乍一看,该路径应该有效。很有可能在 Morphia 尚未被教导处理的内省 kotlin 类中存在一些特殊性。如果您可以提交问题或更好地创建复制器,我可以仔细查看。

“完整”的 Kotlin 支持在我的雷达上,因为我自己是 Kotlin 用户,但可能仍有一些极端情况需要探索。我有一个 kotlin 项目,多年来一直使用 Kotlin 并取得了巨大的成功,但我认为它不一定会像这样进行嵌套文档查询。


推荐阅读