sql >> データベース >  >> NoSQL >> MongoDB

パイプライン集約を使用したSpringDataMongoDBルックアップ

    @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クエリをmongodbSpring実装に渡すことができるようになったので、あとはそれらの値を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. 値がターゲットのソートされたセットに存在する最高スコアよりも大きいスコアを持つ場合のzaddの時間計算量

    2. 最大配列フィールドによる並べ替え、昇順または降順

    3. MongoDB$pullを使用してアレイ内のドキュメントを削除する

    4. Spark HBaseコネクタ–1年のレビュー