Kotlin KMongo库嵌套属性查询始终返回null问题求助
KMongo嵌套属性查询返回null的原因及解决方案
核心原因
- 嵌套字段注解使用错误:你在
auth字段上添加了@BsonProperty(useDiscriminator = true)注解,该注解仅用于多态类型的序列化场景,会在序列化嵌套Auth对象时自动插入类型标识字段,而查询时生成的嵌套条件默认不会携带该类型筛选规则,导致无法匹配已存储的文档。 - 字段名拼写不一致:你的示例单字段查询使用了
User::lastlogin,但实体类中定义的属性名为驼峰格式lastLogin,如果存在类似大小写或拼写错误,也会导致嵌套属性无法匹配。 - 多条件匹配无对应数据:你当前传入的两个查询条件默认按AND逻辑拼接,需要确认数据库中确实存在同时满足两个嵌套属性值的文档。
解决方案
- 移除不必要的多态注解
如果Auth是普通数据类、无多态序列化需求,直接删除auth字段上的@BsonProperty(useDiscriminator = true)注解即可,重新插入数据后嵌套查询即可正常执行。
若必须保留多态标识,查询时需要额外补充类型筛选条件:database.getCollection<User>().findOne( User::auth / Auth::ssaid eq p.ssaid, User::auth / Auth::password eq p.password, User::auth / "_class" eq Auth::class.qualifiedName ) - 验证单个嵌套属性查询有效性
先执行单个嵌套属性的查询,排除数据本身不存在的问题:// 测试单个嵌套属性是否可以正常返回结果 val testResult = database.getCollection<User>().findOne(User::auth / Auth::ssaid eq p.ssaid) - 显式拼接多条件逻辑
可以显式使用and包裹查询条件,避免隐式逻辑异常:database.getCollection<User>().findOne( and( User::auth / Auth::ssaid eq p.ssaid, User::auth / Auth::password eq p.password ) )
内容的提问来源于stack exchange,提问作者user16799920
相关产品推荐
相关产品推荐

