MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Spring Data MongoDB Търсене с Pipeline Aggregation

Въз основа на информацията, предоставена от @dnickless, успях да разреша това. Ще публикувам цялостното решение с надеждата, че ще помогне на някой друг в бъдеще.

Използвам mongodb-driver: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 заявка в нашата mongodb spring реализация, остава само да включим тези стойности в заявка 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();
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. C# - MongoDB - Актуализиране на елемент във вложен документ

  2. Поддокумент за намиране/актуализиране на Mongoose

  3. Какво да избера:MongoDB/Cassandra/Redis/CouchDB?

  4. Няма достъп до свойството на обекта на отговора на Mongoose

  5. Групиране по интервали от дати