Проектирование полей встроенного документа после операции поиска - PullRequest
0 голосов
/ 08 июля 2019

Я хочу сделать объединение между расписанием:

@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");
}

Как проецировать пользовательские поля из документа, внедренного с помощью операции поиска?

1 Ответ

0 голосов
/ 09 июля 2019

я думаю, вам нужно исключить "employee.nickname", "employee.firstName", "employee.fullName" вместо "nickname", "firstName", "fullName"

Попробуйте это:

private ProjectionOperation projectEmployee() {
    return Aggregation.project().andExclude("employee.nickname", "employee.firstName", "employee.fullName");
}
...