MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Recherche Spring Data MongoDB avec agrégation de pipeline

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