2

假设我有两个类如下:

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 链接的子对象,则似乎没有应用它。我可以排除 Order 对象的属性没问题。我遇到的问题是 Person 文档可能会变得非常大,我希望在获取 Order 对象时控制网络流量(即只获取我需要的数据)。

我正在使用 spring-data-mongodb 的 1.0.0.M5 版本

有谁知道是否支持这种操作?

非常感谢

4

2 回答 2

2

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

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

于 2012-07-09T16:35:56.243 回答
0

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

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

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

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

于 2012-07-14T11:34:45.080 回答