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

Kotlin KMongo库嵌套属性查询始终返回null问题求助

KMongo嵌套属性查询返回null的原因及解决方案

核心原因

  1. 嵌套字段注解使用错误:你在auth字段上添加了@BsonProperty(useDiscriminator = true)注解,该注解仅用于多态类型的序列化场景,会在序列化嵌套Auth对象时自动插入类型标识字段,而查询时生成的嵌套条件默认不会携带该类型筛选规则,导致无法匹配已存储的文档。
  2. 字段名拼写不一致:你的示例单字段查询使用了User::lastlogin,但实体类中定义的属性名为驼峰格式lastLogin,如果存在类似大小写或拼写错误,也会导致嵌套属性无法匹配。
  3. 多条件匹配无对应数据:你当前传入的两个查询条件默认按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:27:01