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?

在为嵌套对象创建自定义 Spring Data JPA 查询时获取 IllegalArgumentException

spring data mongodb Query 及分页

如何使用存储库接口在 Spring Data 中通过其嵌套对象的 objectId 查找集合?