@dnickless द्वारा दी गई जानकारी के आधार पर, मैं इसे हल करने में सक्षम था। मैं पूरा समाधान इस उम्मीद में पोस्ट करूंगा कि यह भविष्य में किसी और की मदद करेगा।
मैं मोंगोडब-ड्राइवर का उपयोग कर रहा हूं:3.6.4
सबसे पहले, मुझे एक कस्टम एकत्रीकरण ऑपरेशन क्लास बनाना था ताकि मैं एक कस्टम JSON mongodb क्वेरी में एकत्रीकरण ऑपरेशन में उपयोग करने के लिए पास कर सकूं। यह मुझे pipeline
. का उपयोग करने की अनुमति देगा एक $lookup
. के भीतर जो मेरे द्वारा उपयोग किए जा रहे ड्राइवर संस्करण के साथ समर्थित नहीं है।
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));
}
}
अब जब हमारे पास अपने मोंगोडब स्प्रिंग कार्यान्वयन में एक कस्टम JSON क्वेरी पास करने की क्षमता है, तो उन मानों को टाइप किए गए एग्रीगेशन क्वेरी में प्लग करना बाकी है।
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();
}