【问题标题】:Project embedded document fields after lookup operation查找操作后的项目嵌入文档字段
【发布时间】: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 查询,带有 ma​​tchlookupunwindprojection 操作。

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


【解决方案1】:

我认为您需要排除"employee.nickname", "employee.firstName", "employee.fullName",而不是"nickname", "firstName", "fullName"

试试这个:

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

【讨论】:

  • 哦,这就是我尝试过的,实际上。我这里贴错了。我会更新我的问题。
【解决方案2】:

我是这样做的(不确定是否正确但有效):

private LookupOperation lookupEmployee(){
    return LookupOperation.newLookup()
            .from("employee")
            .localField("employeeId")
            .foreignField("_id")
            .as("employeeLookup");
}

no unwind used

Aggregation.project().and("employeeLookup.firstName").as("employee.firstName")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2012-07-20
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多