Spring data mongodb - пустой результат при попытке агрегировать и проектировать - PullRequest
0 голосов
/ 11 мая 2018

У меня небольшие проблемы с проецированием и поиском с помощью mongooperations. Я всегда получаю пустой результат. Критерии запроса работают нормально без агрегирования. Я попробовал тот же код без разбивки на страницы (пропустить и ограничить) и без сортировки, но я все еще получаю пустой результат.

Мой код:

public List<ProfileBasic> findAllActiveUsersByGenderAndAgeBetweenProjectedPage(Gender gender, int fromAge, int toAge, int pageSize, int page) {

        Criteria criteria = Criteria.where("gender").is(gender).and("confirmed").is(true)
                .and("dateOfBirth").lte(LocalDate.now().minusYears(fromAge))
                .gte(LocalDate.now().minusYears(toAge));
        MatchOperation match = Aggregation.match(criteria);
        ProjectionOperation  project = Aggregation.project()
                .and("id").as("id")
                .and("name").as("name")
                .and("lastName").as("lastName")
                .and("gender").as("gender")
                .and("dateOfBirth").as("dateOfBirth")
                .and("lastVisit").as("lastVisit");
        SkipOperation skip = new SkipOperation(pageSize*(page-1));
        LimitOperation limit = new LimitOperation(pageSize);
        SortOperation sort = new SortOperation(new Sort(Sort.Direction.DESC, "lastVisit"));
        Aggregation aggregate = Aggregation.newAggregation(project, match, skip, limit, sort);
        return operations.aggregate(aggregate, User.class, ProfileBasic.class).getMappedResults();
    }

Буду признателен за любую помощь.

1 Ответ

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

Когда мы делаем Агрегирование в MongoDB, данные обрабатываются поэтапно, а выходные данные одного этапа предоставляются в качестве входных данных для следующего этапа.

В моем коде первый этап был проектом, а не соответствием (запрос):

Aggregation aggregate = Aggregation.newAggregation(project, match, skip, limit, sort);

Вот почему это не сработало.

Я изменил его на:

Aggregation aggregate = Aggregation.newAggregation(match, skip, limit, project, sort);

А теперь работает нормально.

...