说我有两个课程如下:
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版本
有谁知道是否支持这种操作?
非常感谢
乔
2 回答
目前这是不可能的 . 原因是我们使用
fetch()
方法透明地翻译来自商店的DBRef
对象,遗憾的是它不采用字段规范参数 . 我建议在MongoDB Java驱动程序的bug跟踪器和Spring Data MongoDB中打开一张票,让我们选择他们可能引入的附加方法 .解决方法实际上可能是将对象映射为域类中的
DBRef
,并通过触发指定嵌套排除的findOne(…)
手动将其解析为实际对象 .另一种解决方法可能是扩展AbstractMongoEventListener并覆盖onAfterConvert方法并将其公开为Spring Bean
在这里,您可以访问Order对象,然后可以设置您不想要的任何内容 .
您仍将获得具有默认值的空字段,但大小会小得多
或者,您也可以编写一个自定义PersonInfo类,它只包含您需要的字段,并将其设置为Order对象,并将Peson设置为null