Spring Data Mongo - 从@DbRef引用的对象中排除查询中的字段

时间:2012-07-09 10:58:18

标签: mongodb spring-data

说我有两个课程如下:

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 个答案:

答案 0 :(得分:2)

目前无法做到这一点。原因是我们使用DBRef方法透明地翻译来自商店的fetch()对象,遗憾的是,这种方法不采用字段规范参数。我建议在MongoDB Java驱动程序的bug跟踪器和Spring Data MongoDB中打开一张票,让我们选择他们可能引入的附加方法。

此解决方法实际上可能是将对象映射到域类中DBRef,并通过触发指定了嵌套排除的findOne(…)手动将其解析为实际对象。

答案 1 :(得分:0)

另一种解决方法可能是扩展AbstractMongoEventListener并覆盖onAfterConvert方法并将其公开为Spring Bean

在这里,您可以访问Order对象,然后可以设置您不想要的任何内容。

您仍会获得具有默认值的空字段,但尺寸会小得多

或者,您也可以编写一个自定义PersonInfo类,该类只包含您需要的字段并将其设置为Order对象以及将Peson设置为null