gpt4 book ai didi

mongodb - 在 Spring 数据的 RepositoryRestResource 中急切加载 MongoDB @DBRef

转载 作者:行者123 更新时间:2023-12-05 01:18:41 25 4
gpt4 key购买 nike

我正在尝试使用 RepositoryRestResourceRestTemplate 实现 rest api>

一切都很好,除了加载@DBRef 的

考虑这个数据模型:

public class Order
{
@Id
String id;

@DBRef
Customer customer;

... other stuff
}

public class Customer
{
@Id
String id;

String name;

...
}

以及以下存储库(与客户类似)

@RepositoryRestResource(excerptProjection = OrderSummary.class)
public interface OrderRestRepository extends MongoRepositor<Order,String>{}

其余 api 返回以下 JSON:

{
"id" : 4,
**other stuff**,
"_links" : {
"self" : {
"href" : "http://localhost:12345/api/orders/4"
},
"customer" : {
"href" : "http://localhost:12345/api/orders/4/customer"
}
}
}

如果由 resttemplate 正确加载,将创建一个新的 Order 实例,其中 customer = null

是否可以在存储库端热切解析客户并嵌入 JSON?

最佳答案

在这种情况下急切解决依赖实体很可能会引发 N+1 database access problem .我认为没有办法使用默认的 Spring Data REST/Mongo 存储库实现来做到这一点。

这里有一些替代方案:

  1. 构建自己的自定义@RestController 方法,该方法将访问数据库并构建所需的输出
  2. 使用 Projections填充相关集合中的字段,例如

    @Projection(name = "main", types = Order.class)
    public interface OrderProjection {
    ...

    // either
    @Value("#{customerRepository.findById(target.customerId)}")
    Customer getCustomer();

    // or
    @Value("#{customerService.getById(target.customerId)}")
    Customer getCustomer();

    // or
    CustomerProjection getCustomer();
    }

    @Projection(name = "main", types = Customer.class)
    public interface CustomerProjection {
    ...
    }
  3. customerService.getById 可以使用缓存(例如使用 Spring @Cachable annotation )来减轻为每个结果集记录额外访问数据库的性能损失。

  4. 为您的数据模型添加冗余,并在创建/更新时将客户对象字段的副本存储在订单集合中。

出现这种问题,在我看来,是因为 MongoDB 不能很好地支持连接不同的文档集合(它的 "$lookup" operator 与常见的 SQL JOIN 相比有很大的局限性)。 MongoDB docs also do not recommend使用@DBRef 字段,除非加入托管在不同服务器上的集合:

Unless you have a compelling reason to use DBRefs, use manual references instead.

这里还有一个类似的question .

关于mongodb - 在 Spring 数据的 RepositoryRestResource 中急切加载 MongoDB @DBRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43394427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com