Spring Data Mongo — исключить поля в запросе из объекта, на который ссылается @DbRef

Скажем, у меня есть два класса следующим образом:

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 (т.е. получать данные только по мере необходимости).

Я использую версию 1.0.0.M5 spring-data-mongodb.

Кто-нибудь знает, поддерживается ли такая операция?

Большое спасибо

Джо


person Joe Pugh    schedule 09.07.2012    source источник


Ответы (2)


В настоящее время это невозможно. Причина в том, что мы прозрачно транслируем DBRef объекты, поступающие из хранилища, используя метод fetch(), который, к сожалению, не принимает аргумент спецификации поля. Я предлагаю открыть билет в трекере ошибок драйвера Java MongoDB, а также один для Spring Data MongoDB, чтобы мы могли выбрать добавленный метод, который они могут представить.

Обходной путь для этого может состоять в том, чтобы отобразить объект как DBRef внутри класса вашего домена и вручную преобразовать его в фактический объект, запустив findOne(…) с указанными вложенными исключениями.

person Oliver Drotbohm    schedule 09.07.2012

Другим обходным путем может быть расширение AbstractMongoEventListener и переопределение метода onAfterConvert и предоставление его как Spring Bean.

Здесь у вас будет доступ к объекту Order, а затем вы можете установить все, что вы не хотите, на ноль.

Вы по-прежнему будете получать пустые поля со значениями по умолчанию, но размер будет намного меньше.

В качестве альтернативы вы также можете написать собственный класс PersonInfo, который имеет только те поля, которые вам нужны, и установить для него объект Order, а также установить для Peson значение null.

person Nishant    schedule 14.07.2012