spring data mongodb查询嵌套对象和嵌套对象的性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring data mongodb查询嵌套对象和嵌套对象的性能相关的知识,希望对你有一定的参考价值。
我有以下mongodb文档结构,我有几个问题:
[{
"_id" : ObjectId("5a9ad6935625732968b720a6"),
"customer" : {
"_id" : ObjectId("5a9ab4b6acf09dde448e0348"),
"email" : "...",
},
"pType" : {
"_id" : ObjectId("5a9ab4b6acf09dde448e033a"),
"name" : "..."
},
"dateTimeCreated" : ISODate("2018-03-03T17:08:35.351Z"),
"_class" : "..."
}]
1.我目前要做的是选择具有特定客户ID的所有文档
我试过了
@Repository
interface CustomerPassRepo : ReactiveMongoRepository<CustomerPtype, String> {
@Query(value = "{ 'customer.id' : ?0 }")
fun findAllByCustomerId(id: String) : Flux<CustomerPtype>
@Query(value = "{ 'customer._id' : ?0 }")
fun findAllByCustomerId1(id: String) : Flux<CustomerPtype>
fun findAllByCustomer_Id(id: String) : Flux<CustomerPtype>
fun findAllByCustomer_id(id: String) : Flux<CustomerPtype>
}
没有用。
2.此类架构是否会影响查询性能?我的意思是第一种方法慢于
[{
"_id" : ObjectId("5a9ad6935625732968b720a6"),
"customerId" : {
"_id" : "5a9ab4b6acf09dde448e0348",
"email" : "...",
},
"pTypeId" : "5a9ab4b6acf09dde448e033a",
"dateTimeCreated" : ISODate("2018-03-03T17:08:35.351Z"),
"_class" : "..."
}]
第一种方法是占用更多空间,但它更好,因为我以后不需要加入数据。第一种方法是复制客户和pType。
3.还有其他建议吗?
答案
我找到了一个解决方案,说我应该使用ObjectId
作为方法参数。
以下所有工作:
@Query(value = "{ 'customer.id' : ?0 }")
fun findAllByCustomer_Id(objectId: ObjectId) : Flux<CustomerPass>
@Query(value = "{ 'customer.id' : ?0 }")
fun findAllByCustomer(objectId: ObjectId) : Flux<CustomerPass>
@Query(value = "{ 'customer._id' : ?0 }")
fun findAllByCustomer(objectId: ObjectId) : Flux<CustomerPass>
仍然不优雅,但它的工作。我还在寻找答案或替代解决方案。
资料来源:https://stackoverflow.com/a/34169761/869793
以上是关于spring data mongodb查询嵌套对象和嵌套对象的性能的主要内容,如果未能解决你的问题,请参考以下文章
spring data - Mongodb - findBy 嵌套对象的方法
使用 Spring Data 在 Redis 中查询嵌套对象
如何在spring数据mongodb中聚合一个嵌套对象并避免PropertyReferenceException?