【问题标题】:Spring Data Mongo - Exclude fields in query from object referenced by @DbRefSpring Data Mongo - 从@DbRef 引用的对象中排除查询中的字段
【发布时间】:2012-07-08 18:31:59
【问题描述】:

假设我有两个类如下:

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 版本

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

非常感谢

【问题讨论】:

    标签: mongodb spring-data


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      您仍然会得到具有默认值的空字段,但大小会小很多

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

      【讨论】:

        猜你喜欢
        • 2015-02-19
        • 2013-05-20
        • 2017-07-18
        • 2017-01-06
        • 1970-01-01
        • 2019-05-13
        • 2017-05-02
        • 2016-09-01
        • 1970-01-01
        相关资源
        最近更新 更多