Получить несколько списков, сгруппированных по разным полям - PullRequest
0 голосов
/ 29 мая 2018

Я использую этот метод для отправки нескольких списков клиенту.

 public ResponseEntity<?> getFiveLastRequestOfEachVehicleType() {
    ResponseContent content = getResponseContent();
    Map<String, List<Request>> map = new HashMap<>();
    GroupBy groupBy = new GroupBy();
    groupBy.initialDocument("vehicleTypeEnum");
    query = new Query();
    queryFieldsFilterLastFiveRequest(query, VehicleTypeEnum.NEISAN);
    map.put("NEISAN", mongoOperations.find(query, Request.class));
    query = new Query();
    queryFieldsFilterLastFiveRequest(query, VehicleTypeEnum.BADSAN);
    map.put("BADSAN", mongoOperations.find(query, Request.class));
    query = new Query();
    queryFieldsFilterLastFiveRequest(query, VehicleTypeEnum.BUJE);
    map.put("BUJE", mongoOperations.find(query, Request.class));
    content.setData(map);
    return getReturn(content);

}

И этот метод применяет критерии к каждому запросу

private void queryFieldsFilterLastFiveRequest(Query query, VehicleTypeEnum vehicleTypeEnum) {
    query.addCriteria(Criteria.where("vehicleTypeEnum").is(vehicleTypeEnum));
    query.addCriteria(Criteria.where("unlock").is(true));
    query.fields()
            .include("id")
            .include("goodsTypeTitle")
            .include("originCityTitle")
            .include("price");
    query.limit(5);
}

Интересно, есть ли способ получить весь список в одном запросе к базе данных, используя MongoOperations.

1 Ответ

0 голосов
/ 29 мая 2018

Я бы позже пошел к группировке вручную, первый запрос для всех транспортных средствТип:

private void queryFieldsFilterLastFiveRequest(Query query, VehicleTypeEnum... vehicleTypeEnum..) {
    query.addCriteria(Criteria.where("vehicleTypeEnum").in(vehicleTypeEnum));
    query.addCriteria(Criteria.where("unlock").is(true));
    query.fields()
            .include("id")
            .include("goodsTypeTitle")
            .include("originCityTitle")
            .include("price");
    query.limit(5);
}

Здесь is был изменен на in, и принимаю список VehicleTypeEnum

Затем, чтобы использовать его:

 public ResponseEntity<?> getFiveLastRequestOfEachVehicleType() {
    ResponseContent content = getResponseContent();
    Map<String, List<Request>> map;

    query = new Query();
    queryFieldsFilterLastFiveRequest(query, VehicleTypeEnum.NEISAN, VehicleTypeEnum.BADSAN, VehicleTypeEnum.BUJE);

    map = mongoOperations.find(query, Request.class).stream()
    .collect(Collectors.toMap(r -> r.getVehicleTypeEnum().name(),r -> r));
    content.setData(map);
    return getReturn(content);

}

Здесь я использую API-интерфейс потока для группировки результатов по имени GTuleTypeEnum

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...