Пружинный трубопроводный агрегат - PullRequest
0 голосов
/ 23 апреля 2020
MatchOperation matchDepartmentStage = Aggregation.match(Criteria.where("department").is("DEPT_A"));
ProjectionOperation projectEmployeeStage = Aggregation.project()
        .andExpression("concat(emp_name,'-', emp_age)").as("emp_name_age");
Criteria criteriaNameAndAge = new Criteria();
List<Pair<String,String>> nameAndAgeList = new ArrayList<>();
nameAndAgeList.add(Pair.of("abcd", "30"));

nameAndAgeList.forEach(nameAndAge -> {
    criteriaNameAndAge.and("emp_name_age").ne(nameAndAge.getFirst()+"-"+nameAndAge.getSecond());
});
MatchOperation matchNameAndAgeStage = Aggregation.match(criteriaNameAndAge);
SortOperation sortStage = Aggregation.sort(Sort.Direction.ASC, "dateCreated");

Aggregation aggregation = Aggregation.newAggregation(matchDepartmentStage,
        projectEmployeeStage,
        matchNameAndAgeStage,
        sortStage);

Employee employee = null;
AggregationResults<Employee> employeeAggregationResults =
            mongoTemplate.aggregate(aggregation, "employees", Employee.class);

Моя попытка сделать следующее:

  1. Отфильтровать сотрудников по отделам

  2. Из результатов для каждого сотрудника, проекта новое поле, объединяющее 2 поля: от emp_name и emp_age до emp_name_age

  3. Создание динамических c критериев соответствия для соответствия этому новому полю

  4. Сортировать по дате

Работает не так, как ожидалось. Ошибка недействительной ссылки 'dateCreated'

Образцы документов:


{ "_id" : "1", "department" : "DEPAT_A", "name" : "abcd", "age" : "30", "dateCreated" : ISODate("2019-12-31T10:30:00Z"), "_class" : "org.example.Employee" }
{ "_id" : "2", "department" : "DEPAT_A", "name" : "abcd", "age" : "40", "dateCreated" : ISODate("2019-12-31T10:30:00Z"), "_class" : "org.example.Employee" }

EDIT

изменил несколько строк, и он работает. Выявлено 2 проблемы.

  1. В проекте должны быть указаны поля. В моем случае назовите все поля, которые мне не понравились.

  2. Используйте nin вместо ne

ProjectionOperation projectEmployeeStage = Aggregation.project(Field.fields("department","name","age","dateCreated"))
        .andExpression("concat(emp_name,'-', emp_age)").as("emp_name_age");
List<String> nameAges = nameAndAgeList.stream()
                .map(nameAge -> nameAge.getFirst()+"-"+nameAge.getSecond())
                .collect(Collectors.toList());
Criteria criteriaNameAndAge = new Criteria("emp_name_age").nin(nameAges);
MatchOperation matchNameAndAgeStage = Aggregation.match(criteriaNameAndAge);
...