Java - Spring Boot - MongoDB - 聚合 - AggregationOperation - 使用多个字段连接两个集合

问题描述 投票:0回答:1

我正在使用 Java、Spring Boot、MongoDB。 我有课:

@Document("Master")
public class Master {
    @Id
    private String id;
    private String code;
    private String name;
    private String companyCode;
    private String version;
}

我还有另一堂课:

@Document("Child")
public class Child {
    @Id
    private String id;
    private String code;
    private String name;
    private String companyCode;
    
    private String masterCode;
    private String masterVersion;
}

我有聚合功能:

public Document testquery() {
    ArrayList<AggregationOperation> aggregationOperations = new ArrayList<AggregationOperation>();
    ProjectionOperation projection = Aggregation.project();
    String companyCode = "23112";

    Criteria criteriaCompanyCode = Criteria.where("companyCode").is(companyCode);
    AggregationOperation newAggregationCompanyCode = Aggregation.match(criteriaCompanyCode);
    aggregationOperations.add(newAggregationCompanyCode);

    LookupOperation lookup1 = Aggregation.lookup("Child", "code", "masterCode", "l2");
    aggregationOperations.add(lookup1);
    UnwindOperation un = Aggregation.unwind("l2");
    aggregationOperations.add(un);
    
    ProjectionOperationBuilder partLynProcess_code = projection.and("companyCode");
    projection = partLynProcess_code.as("Master_companyCode");
    ProjectionOperationBuilder partLynProcess_code = projection.and("code");
    projection = partLynProcess_code.as("Master_code");
    ProjectionOperationBuilder partLynProcess_name = projection.and("name");
    projection = partLynProcess_name.as("Master_name");
    ProjectionOperationBuilder partLynProcess_version = projection.and("version");
    projection = partLynProcess_version.as("Master_version");
    ProjectionOperationBuilder partdataLynSolutionTask = projection.and("l2");
    projection = partdataLynSolutionTask.as("l2");

    aggregationOperations.add(projection);

    Aggregation aggregation = Aggregation.newAggregation(aggregationOperations);

    Document response = mongoTemplate.aggregate(aggregation, "Master", Object.class).getRawResults();
    return response;
}

在上面的函数中,仅使用 Child 的属性“masterCode”和 Master 的“code”来将 Child 与 Master 进行匹配。

我想使用以下三个将孩子与主人相匹配: Child 的属性“masterCode”与 Master 的“code”, 子级的属性“companyCode”与主级的“companyCode” 和 Child 的属性“masterVersion”与 Master 的“version”。

我该怎么做?

java mongodb spring-boot aggregation
1个回答
0
投票

当我发布这个问题时,是在一天失败之后。不过,我找到了办法。

我对其他字段使用了以下模式:

    MongoExpression mongoExpressionChildCompanyCode = MongoExpression.create("'$expr': { '$eq': ['$l2.companyCode', '$companyCode']}");
    AggregationExpression aggregationExpressionChildCompanyCode = AggregationExpression.from(mongoExpressionChildCompanyCode);
    AggregationOperation newAggregationChildCompanyCode = Aggregation.match(aggregationExpressionChildCompanyCode);
    aggregationOperations.add(newAggregationChildCompanyCode);

希望对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.