En m'appuyant sur les informations fournies par @dnickless, j'ai pu résoudre ce problème. Je publierai la solution complète dans l'espoir qu'elle aidera quelqu'un d'autre à l'avenir.
J'utilise mongodb-driver:3.6.4
Tout d'abord, j'ai dû créer une classe d'opération d'agrégation personnalisée afin de pouvoir transmettre une requête mongodb JSON personnalisée à utiliser dans l'opération d'agrégation. Cela me permettra d'utiliser pipeline
dans un $lookup
qui n'est pas pris en charge par la version du pilote que j'utilise.
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));
}
}
Maintenant que nous avons la possibilité de transmettre une requête JSON personnalisée dans notre implémentation de printemps mongodb, il ne reste plus qu'à insérer ces valeurs dans une requête 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();
}