2017-02-25 5 views
0

私はJavaのMorphiaライブラリを使用しています。私は成功した番組のタイトルの最初の文字で私にショー・グループのリストを与える次集計

db.shows.aggregate([ 
    {$project: { 
     _id: 1, 
     title: 1 
    }}, 
    {$group: 
     { 
      _id: {titleLetter: {$substr: ["$title", 0, 1]}}, 
      count: {$sum: 1}, 
      shows: {$push: "$title"} 
     } 
    }, 
    {$sort: {_id: 1}} 
]); 

を実行することができたコマンドラインクライアント経由

モルフィアの公式docsには、DBObjectAdvancedDatastore.createQueryが含まれていますが、集合体には何も表示されません。

おそらく、私は、だから私が何かMorphiaにCLIクエリに変換することができますか何かにimport com.mongodb.*;から少なくとも何か同様BasicDBObjectBuilderアプローチ

DBObject group = BasicDBObjectBuilder.start().push("$group") 
     .add("_id", "{titleLetter: {$substr: [\"$title\", 0, 1]}}") 
     .get(); 

がある

BasicDBObject parse = (BasicDBObject) JSON.parse("{$group: { _id: {titleLetter: {$substr: [\"$title\", 0, 1]}}, count: {$sum: 1}, shows: {$push: \"$title\"} } }"); 

のようなものを使用しているJavaの理解する。

どのような方法でもこのクエリをJavaから実行することができませんでした。

私の質問は、cliの集約クエリをJavaのクエリに変換して最終的にJavaオブジェクトを返すきっかけになっていますか?

答えて

1

Input,OutputおよびMainクラスを以下のように作成します。

メインクラスは、Cliクエリと同等のモルフィアを作成し、入出力クラスを提供します。

Morphiaは、要求と応答との間でmongoデータをマッピングすることを確認します。&

入力クラス

package org.mongodb.morphia; 
import org.bson.types.ObjectId; 
import org.mongodb.morphia.annotations.Entity; 
import org.mongodb.morphia.annotations.Id; 
import java.io.Serializable; 

@Entity("Input") 
public class Input implements Serializable { 
    @Id 
    private ObjectId id; 
    private String title; 
    //Getters and Setters 
} 

出力クラス

package org.mongodb.morphia; 
import java.util.List; 
public class Output { 
    private int count; 
    private List<String> shows; 
//Getters and Setters 
} 

メインクラス

package org.mongodb.morphia; 
import com.mongodb.MongoClient; 
import org.mongodb.morphia.aggregation.AggregationPipeline; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 
import static org.mongodb.morphia.aggregation.Accumulator.accumulator; 
import static org.mongodb.morphia.aggregation.Group.*; 
import static org.mongodb.morphia.aggregation.Projection.projection; 
import static org.mongodb.morphia.query.Sort.descending; 

public class MorphiaClient { 
    public static void main(String[] args) { 
     final Morphia morphia = new Morphia(); 
     morphia.mapPackage("org.mongodb.morphia"); 
     final Datastore datastore = morphia.createDatastore(new MongoClient(), "test"); 
     AggregationPipeline pipeline = datastore.createAggregation(Input.class). 
       project(projection("id"), projection("title")). 
       group(id(grouping("titleLetter", accumulator("$substr", Arrays.asList("$title", 0, 1)))), 
         grouping("count", accumulator("$sum", 1)), 
         grouping("shows", accumulator("$push", "title"))). 
       sort(descending("id")); 
     List<Output> results = new ArrayList<>(); 
     Iterator<Output> iterator = pipeline.aggregate(Output.class); 
     while (iterator.hasNext()) { 
      results.add(iterator.next()); 
     } 
    } 
} 
+0

ありがとうございます。これは、優れた明確な答えです。このようなパイプラインを使うことは、JSONと同じように読みやすく、書くのが簡単です。ありがとう – Victory