spring - 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"
}
}
有任何想法吗?
谢谢。
解决方案
请参阅有关映射的 Spring Data MongoDB 参考- 该_id
字段被特殊处理。如果它是 String 或 BigInteger 类型,它将自动转换为/从ObjectId
. 不过, MongoDB 支持特殊_id
字段的纯字符串,因此如果您插入的文档不通过 Spring Data(或将文档插入为原始 JSON 字符串以供 MongoDB 驱动程序插入),那么 MongoDB 不会自动将字符串转换为ObjectId
- 它将它们存储为字符串。
因此,如果您将文档{"_id": "5e5605150"}
插入数据库,Spring Data MongoDB 映射器将无法找到它,因为它只会搜索ObjectId
。
推荐阅读
- javascript - 做原生方法和属性的console.log
- python - 无法解析剩余部分:来自 '% form.as_p %' 的 '% form.as_p %'
- json - 映射条件子元素
- javascript - 如何从 selenium 中的多个父级获取每个父类的多个子元素?
- r - 向大df中的对应值添加一个小向量
- python - tf.constant 有多恒定?
- flutter - 如何在某些屏幕中显示/隐藏底部导航栏?
- linux - 从命令获取 GNU makefile 目标
- javascript - 孙子渲染时其道具不变
- arrays - 将我的数组内容排序到网格中 [SwiftUI]