我正在使用 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”。
我该怎么做?
当我发布这个问题时,是在一天失败之后。不过,我找到了办法。
我对其他字段使用了以下模式:
MongoExpression mongoExpressionChildCompanyCode = MongoExpression.create("'$expr': { '$eq': ['$l2.companyCode', '$companyCode']}");
AggregationExpression aggregationExpressionChildCompanyCode = AggregationExpression.from(mongoExpressionChildCompanyCode);
AggregationOperation newAggregationChildCompanyCode = Aggregation.match(aggregationExpressionChildCompanyCode);
aggregationOperations.add(newAggregationChildCompanyCode);
希望对其他人有帮助。