【发布时间】:2019-11-17 14:45:00
【问题描述】:
我想在 Timesheet 之间进行连接:
@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 查询,带有 match、lookup、unwind 和 projection 操作。
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");
}
它成功返回带有嵌入的员工文档的时间表文档。重点是:我不希望所有数据都来自员工。我只想要几个字段。
所以,我尝试使用我的投影操作从员工中排除不需要的字段:
private ProjectionOperation projectEmployee() {
return Aggregation.project().andExclude("employee.nickname", "employee.firstName", "employee.fullName");
}
没有用。我的嵌入式员工仍在返回所有字段。但是,如果我执行以下操作,我可以成功地从时间表中排除字段:
private ProjectionOperation projectEmployee() {
return Aggregation.project().andExclude("startDate", "endDate");
}
如何从通过查找操作嵌入的文档中投影自定义字段?
【问题讨论】:
-
你能展示你的架构吗?
-
@RaviShankarBharti 已更新!
标签: spring mongodb spring-boot aggregation-framework spring-data-mongodb