2017-11-09 19 views
7

私はAggregation aggregationをパラメタとして受け取る関数を持っています。Spring Mongo>集計から集計オペレーションを集める方法

AggregationOperationaggregationから取得したいと考えています。それを行う方法はありますか?

public Aggregation newCustomAggregation(Aggregation aggregation, Criteria c) { 
    // How to get list operation aggregation there? 
    listOperation.push(Aggregation.match(c)); 
    return Aggregation 
      .newAggregation(listOperations); 
} 

私の目的は私のカスタムMatchAggregationを持つ別のAggregation新しいです。

+0

よう

何か? – chridam

+0

こんにちはchridam、パラメータとして受け取ったときに結果をフィルタリングするための動的条件を追加するために使用したいと思います(query.addCriteria(... myCriteria)と同様) –

答えて

4

集約をサブクラス化して保護された操作フィールドにアクセスすることで、独自のカスタム集約の実装を作成できます。あなたはこの `newCustomAggregation`機能を使用する予定はどうすればよい

public class CustomAggregation extends Aggregation { 
     List<AggregationOperation> getAggregationOperations() { 
     return operations; 
    } 
} 

public Aggregation newCustomAggregation(Aggregation aggregation, Criteria c) { 
    CustomAggregation customAggregation = (CustomAggregation) aggregation; 
    List<AggregationOperation> listOperations = customAggregation.getAggregationOperations(); 
    listOperations.add(Aggregation.match(c)); 
    return Aggregation .newAggregation(listOperations); 
} 
+0

これは質問に答えません。質問は、 'Aggregation'インスタンスから' AggregationOperation'のリストを取得することです。この解決法は、 'CustomAggregation'インスタンスからのみ' AggregationOperation'のリストを取得します。それ以外の '集約 'の場合は' ClassCastException'を投げます。私はそれにあまり意味がありません。 – jannis

+0

@jannisすでに述べたように、 'Aggregation'クラスから' operations'フィールドを取得する方法はありません。私は答えを提供しました。ここでopは '集約'クラスをサブクラス化して 'protected'' operations'フィールドにアクセスし、getterを通してそのフィールドを公開することができます。どの部分がまだ明確でないか教えてください。 – Veeram

+0

私はそれがはっきりしていないと言っているわけではありません。私はそれが質問に答えないと言っている。 – jannis

2

Aggregationのプロパティはoperationsで、適用される操作はすべてAggregationになります。

protected List<AggregationOperation> allOperations = aggregation.operations ; 

は、適用されるすべての操作を行います。

+2

A)静的ではありません。 B)保護されています。 – jannis

+0

注目していただきありがとうございます。更新された私の答え –

+0

私は見たが、このプロパティを取得する方法はありません..何か方法はありますか? –

4

短い回答:いいえ、いい方法はありません。

Aggregationインスタンス外部からAggregationOperationリストを取得するのない「簡単な」方法はありません - operationsAggregationクラスの保護されたプロパティです。

あなたは簡単に反映させることができますが、このようなコードは壊れやすく、維持管理にコストがかかります。おそらく、この財産が保護されたままの理由があります。これについて​​で尋ねることができます。私はこれに代わるアプローチがあると仮定します。

もちろん、AggregationOperationのコレクションを取得する方法を変更することはできますが、あなたのケースでこの解決策が実現可能かどうかについては、投稿に情報がありません。