MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ricerca di Spring Data MongoDB con aggregazione della pipeline

Basandosi sulle informazioni fornite da @dnickless, sono stato in grado di risolvere questo problema. Pubblicherò la soluzione completa nella speranza che possa aiutare qualcun altro in futuro.

Sto usando mongodb-driver:3.6.4

Innanzitutto, ho dovuto creare una classe operativa di aggregazione personalizzata in modo da poter passare una query mongodb JSON personalizzata da utilizzare nell'operazione di aggregazione. Questo mi permetterà di usare pipeline all'interno di una $lookup che non è supportato con la versione del driver che sto utilizzando.

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));
    }
}

Ora che abbiamo la possibilità di passare una query JSON personalizzata nella nostra implementazione primaverile mongodb, non resta che inserire quei valori in una query 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();
}