说我有两个课程如下:
public class Person {
private String personId;
private String name;
private Address address;
}
public class Order {
private String orderId;
@DbRef
private Person customer;
}
我想要做的是对Order集合运行查询,但只返回链接的Person对象的特定字段,如:
public Order findByOrderId(String orderId) {
Query query = query(where("orderId").is(orderId));
query.fields().exclude("person.address");
return operations.findOne(query,Order.class);
}
我得到了返回的数据但是如果它是跨越通过@DbRef链接的子对象,那么我的exclude参数似乎没有被应用。我可以排除Order对象的属性没问题。我遇到的问题是Person文档可能会变得非常大,我想在获取Order对象时控制网络流量(即只获得我需要的数据)。
我正在使用spring-data-mongodb的1.0.0.M5版本
有谁知道是否支持这种操作?
非常感谢
乔
答案 0 :(得分:2)
目前无法做到这一点。原因是我们使用DBRef
方法透明地翻译来自商店的fetch()
对象,遗憾的是,这种方法不采用字段规范参数。我建议在MongoDB Java驱动程序的bug跟踪器和Spring Data MongoDB中打开一张票,让我们选择他们可能引入的附加方法。
此解决方法实际上可能是将对象映射到域类中DBRef
,并通过触发指定了嵌套排除的findOne(…)
手动将其解析为实际对象。
答案 1 :(得分:0)
另一种解决方法可能是扩展AbstractMongoEventListener并覆盖onAfterConvert方法并将其公开为Spring Bean
在这里,您可以访问Order对象,然后可以设置您不想要的任何内容。
您仍会获得具有默认值的空字段,但尺寸会小得多
或者,您也可以编写一个自定义PersonInfo类,该类只包含您需要的字段并将其设置为Order对象以及将Peson设置为null