Агрегация MongoTemplate не отображает результат - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь запустить конвейер агрегации в проекте весенней загрузки, используя MongoTemplate и структуру агрегации.

Мой запрос выполняется без каких-либо исключений.Но когда я пытаюсь вызвать getMappedResults() в экземпляре AggregationResults, это всегда дает мне пустой список.Однако, если я проверю результат в отладчике, то увижу, что метод getRawResults() возвращает значения.

Я использую spring-boot версия 1.5.9.RELEASE и spring-boot-starter-data-mongodb версия 2.1.2.RELEASE

Я не уверен, что делаю неправильно.


Ниже приведен код агрегации

    GroupOperation groupOperation = Aggregation.group("field1", "field2")
            .count().as("count")
            .max("timestamp").as("timestamp");

    ProjectionOperation projectionOperation = Aggregation.project("field1", "field2", "count", "timestamp");

    DBObject cursor = new BasicDBObject(10);
    AggregationOptions aggregationOptions = Aggregation.newAggregationOptions().cursor(cursor).build();

    Aggregation aggregation = Aggregation.newAggregation(groupOperation, projectionOperation).withOptions(aggregationOptions);
    AggregationResults<Res> activities = mongoTemplate.aggregate(aggregation, "test_collection", Res.class);

Ниже приведен класс, в котором я пытаюсь отобразить результат

public class Res {
    public String field1;

    public String field2;

    public Long timestamp;

    public Integer count;

    public Res() {
    }

    public Res(String field1, String field2, Long timestamp, Integer count) {
        this.field1 = field1;
        this.field2 = field2;
        this.timestamp = timestamp;
        this.count = count;
    }
}

Примечание Если я пропускаю курсор в AggregationOptions, я получаю следующую ошибку

'The 'cursor' option is required, except for aggregate with the explain argument'

1 Ответ

0 голосов
/ 05 февраля 2019

Исходя из моего опыта, GroupOperation приведет к массиву документов со следующей схемой:

{
  _id: {
    field1:"field1",
    field2:"field2"
  },
  count: countResult,
  timestamp:timestamp
}

В этом случае ProjectOperation не приведет к документам, которые отображают ваш класс сущности.

Я бы предложил вам активировать ведение журнала отладки, добавив logging.level.org.springframework.data=debug в ваш файл application.properties.Таким образом, вы сможете увидеть, какие запросы отправляются в MongoDB, и воспроизвести их в MongoShell, чтобы увидеть результат каждой из ваших операций агрегирования.

Быстрый способ проверить гипотезу о том, что ваш класс сущностей не отображается правильноиз-за результата GroupOperation нужно добавить Setters и удалить второй Constructor.Атрибуты count и timestamp должны быть правильно сопоставлены, а объект Res будет создан только с использованием свойств count и timestamp.

Примечание : Из этогоpost, для агрегации требуется курсор, так как Mongo 3.6 и MongoDB 3.6 требуют пружины 1.5.10.RELEASE для операций агрегирования.Concider обновил Spring-boot до 1.5.10, чтобы пропустить курсор.

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