Я хочу сделать объединение между расписанием:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = TIMESHEET_COLLECTION)
public class Timesheet {
@Id
private ObjectId id;
private ObjectId employeeId;
private LocalDate date;
private String occupationTitle;
private BigDecimal salary;
private List<TimesheetEntry> entries;
}
и Сотрудником (как встроенный документ):
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = Employee.EMPLOYEE_COL)
public class Employee {
@Id
private ObjectId id;
private String registry;
private String cpf;
private String firstName;
private String lastName;
private String nickname;
private String phone;
private LocalDate dateOfBirth;
private LocalDate admissionDate;
private EmployeeOccupation occupation;
private EmployeePaymentPreferences paymentPreferences;
private Map<String, String> equipmentPreferences;
private Boolean active;
}
Итак, у меня есть запрос агрегация , с соответствием , поиском , размоткой и проекцией операциями.
Aggregation aggregation = Aggregation.newAggregation(matchTimesheetFilter(timesheetFilter), lookupEmployee(), unwindEmployee(), projectEmployee());
Существуют реализации поиска и раскрутки.Я раскручиваю, потому что сотрудник должен быть одним объектом, а не массивом.
private LookupOperation lookupEmployee(){
return LookupOperation.newLookup()
.from("employee")
.localField("employeeId")
.foreignField("_id")
.as("employee");
}
private UnwindOperation unwindEmployee(){
return Aggregation.unwind("employee");
}
Он успешно возвращает документ расписания со вложенным документом Employee .Дело в том, что я не хочу всех данных от сотрудника.Мне нужно только несколько полей .
Итак, я попытался исключить ненужные поля из сотрудника, используя мою операцию проекции:
private ProjectionOperation projectEmployee() {
return Aggregation.project().andExclude("employee.nickname", "employee.firstName", "employee.fullName");
}
Это не сработало.Мой встроенный сотрудник все еще возвращается со всеми полями.Однако я могу успешно исключить поля из расписания, если я сделаю что-то вроде этого:
private ProjectionOperation projectEmployee() {
return Aggregation.project().andExclude("startDate", "endDate");
}
Как проецировать пользовательские поля из документа, внедренного с помощью операции поиска?