首页 > 解决方案 > Spring Boot 和 Mongo - findById 仅适用于 ObjectID 而不是 String 的 Id

问题描述

我有一个从 Mongo 读取的 Spring Boot GraphQL 服务。

我注意到,如果我的 MongoDB 文档 ID 具有ObjectID例如"_id": ObjectID("5e5605150")我能够从做myRepository.findById(myId).

但是,如果该 id 只是一个类似"_id": "5e5605150"then的字符串,则findById不会返回任何内容。

存储库如下所示:

@Repository
interface MyRepository : MongoRepository<Song, String>

那首歌曲看起来像这样:

@Document(collection = Song.COLLECTION)
data class Song(
    @Id
    val id: String,

    val title: String
) {
    companion object {
        const val COLLECTION: String = "song"
    }
}

有任何想法吗?

谢谢。

标签: springmongodbspring-boot

解决方案


请参阅有关映射的 Spring Data MongoDB 参考- 该_id字段被特殊处理。如果它是 String 或 BigInteger 类型,它将自动转换为/从ObjectId. 不过, MongoDB 支持特殊_id字段的纯字符串,因此如果您插入的文档不通过 Spring Data(或将文档插入为原始 JSON 字符串以供 MongoDB 驱动程序插入),那么 MongoDB 不会自动将字符串转换为ObjectId- 它将它们存储为字符串。

因此,如果您将文档{"_id": "5e5605150"}插入数据库,Spring Data MongoDB 映射器将无法找到它,因为它只会搜索ObjectId


推荐阅读