Dựa trên thông tin được cung cấp bởi @dnickless, tôi đã có thể giải quyết vấn đề này. Tôi sẽ đăng giải pháp hoàn chỉnh với hy vọng nó sẽ giúp ích cho người khác trong tương lai.
Tôi đang sử dụng mongodb-driver:3.6.4
Đầu tiên, tôi phải tạo một lớp hoạt động tổng hợp tùy chỉnh để tôi có thể chuyển vào một truy vấn mongodb JSON tùy chỉnh sẽ được sử dụng trong hoạt động tổng hợp. Điều này sẽ cho phép tôi sử dụng pipeline
trong $lookup
không được hỗ trợ với phiên bản trình điều khiển mà tôi đang sử dụng.
public class CustomProjectAggregationOperation implements AggregationOperation {
private String jsonOperation;
public CustomProjectAggregationOperation(String jsonOperation) {
this.jsonOperation = jsonOperation;
}
@Override
public Document toDocument(AggregationOperationContext aggregationOperationContext) {
return aggregationOperationContext.getMappedObject(Document.parse(jsonOperation));
}
}
Bây giờ chúng tôi có khả năng chuyển một truy vấn JSON tùy chỉnh vào triển khai mùa xuân mongodb của chúng tôi, tất cả những gì còn lại là cắm các giá trị đó vào một truy vấn TypedAggregation.
public List<FulfillmentChannel> getFulfillmentChannels(
String SOME_VARIABLE_STRING_1,
String SOME_VARIABLE_STRING_2) {
AggregationOperation match = Aggregation.match(
Criteria.where("dayOfWeek").is(SOME_VARIABLE_STRING_1));
AggregationOperation match2 = Aggregation.match(
Criteria.where("deliveryZipCodeTimings").ne(Collections.EMPTY_LIST));
String query =
"{ $lookup: { " +
"from: 'deliveryZipCodeTiming'," +
"let: { location_id: '$fulfillmentLocationId' }," +
"pipeline: [{" +
"$match: {$expr: {$and: [" +
"{ $eq: ['$fulfillmentLocationId', '$$location_id']}," +
"{ $eq: ['$zipCode', '" + SOME_VARIABLE_STRING_2 + "']}]}}}," +
"{ $project: { _id: 0, zipCode: 1, cutoffTime: 1 } }]," +
"as: 'deliveryZipCodeTimings'}}";
TypedAggregation<FulfillmentChannel> aggregation = Aggregation.newAggregation(
FulfillmentChannel.class,
match,
new CustomProjectAggregationOperation(query),
match2
);
AggregationResults<FulfillmentChannel> results =
mongoTemplate.aggregate(aggregation, FulfillmentChannel.class);
return results.getMappedResults();
}