2016-09-08 11 views
3

Javaの春データに複数のフィールドをプッシュ:私はJavaの春データ-MongoDBの中にこのクエリを必要とする

db.wizard.aggregate(
{ 
$group: { 
    _id: "$title", 
    versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}} 
    } 
}) 

を、私の現在のソリューションは、次のようになります。

Aggregation agg = Aggregation.newAggregation(
      Aggregation.group("title"). 
        push("version").as("versions") 
    ); 

問題は、プッシュメソッド(version、author、dateAdded)にフィールドを追加する方法がわかりません。 Spring-Data-MongoDBで可能ですか?

+0

あなたは、「文字列化」モンゴシェルクエリを置く 'AggregationOperation'クラスを拡張し、' toDBObject'または類似の方法(ドライブのバージョンに応じて)をオーバーライドします。私はネイティブのスプリングデータと互換性のない集計ステップの回避策をたくさん使用しました – Valijon

+0

必要があれば、例を追加することができます – Valijon

+0

例を投稿すると素晴らしいでしょう – quiros

答えて

1

注: MongoDBのバージョン2.6から3.0(互換性のあるJavaドライバ)

私はカスタムtoDBObjectメソッドを実装するorg.springframework.data.mongodb.core.aggregation.AggregationOperationクラスを拡張しました:お使いの場合には

public class GenericAggregationOperation implements AggregationOperation { 

    private String operator; 
    private DBObject query; 

    /** 
    * Default constructor. 
    * 
    * @param operator MongoDB operator ($group, $sort, $project, etc..) 
    * @param query MongoDB aggregation query step string 
    */ 
    public GenericAggregationOperation(String operator, String query) { 
     this(operator, (DBObject) JSON.parse(query)); 
    } 

    /** 
    * Default constructor. 
    * 
    * @param operator MongoDB operator ($group, $sort, $project, etc..) 
    * @param query MongoDB aggregation query step DBObject 
    */ 
    public GenericAggregationOperation(String operator, DBObject query) { 
     this.operator = operator; 
     this.query = query; 
    } 

    @Override 
    public DBObject toDBObject(AggregationOperationContext context) { 

     return new BasicDBObject(operator, query); 
    } 

} 

を、それは次のようになります。

List<AggregationOperation> list = new ArrayList<AggregationOperation>(); 
lista.add(new GenericAggregationOperation("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }")); 

TypedAggregation<EpisodeIndexDto> agg = Aggregation.newAggregation(
    YourClassTitleVersion.class, list); 
mongoOperations.aggregate(agg, YourClassTitleVersion.class, 
    YourClassTitleVersion.class).getMappedResults(); 

希望すると、これが役に立ちます。

+1

ありがとう、魅力のように動作します。 – quiros

+0

パーフェクト。どういたしまして – Valijon

7

BasicDbObjectを集約パイプラインステージのいずれかに直接渡すことができます。

Aggregation agg = newAggregation(
      group("title"). 
      push(new BasicDBObject 
        ("version", "$version").append 
        ("author", "$author").append 
        ("dateAdded", "$dateAdded")).as("versions"));