首页 文章

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

提问于
浏览
1

说我有两个课程如下:

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

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

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

  • 2

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

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

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

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

相关问题