2

MongoDB 集約フレームワークを使用してドキュメントを照会しています。結果は次のとおりです。

{
        "result" : [
                {
                        "_id" : "luke",
                        "times" : 8
                },
                {
                        "_id" : "albert",
                        "times" : 4
                },
                {
                        "_id" : "matt",
                        "times" : 4
                }
        ],
        "ok" : 1
}

上記の結果からわかるように、クエリは mongoDB シェルで機能しますが、Jongo で結果を取得するときに問題があります。

        Aggregationoutput = 
                gamesCollection.aggregate(
                "{ ... }"
                ).as(Aggregation.class);
        output.results().iterator().hasNext();

AggregationOutput主な問題は、Jongo が?の使用を許可していないことのようです。彼は代わりに望んでAggregationいます...しかし、それを使用する方法に関する利用可能な例が見つかりません

編集: Jongo を集計で動作させることができないことに少し不満を感じています。MongoDB Java ドライバーで指定されているようにクエリを作成する必要がDBObjectsありましたが、コードは非常に見苦しく見えます..

EDIT2: 情報を完成させるために、これはJongoで使用していた元の集計であり、ResultObjectにアンマーシャリングできませんでした

List<ResultObject> output = 
                gamesCollection.aggregate(
                "{ $match: { 'playersList.playerid': 'bob' }},"
                +"{ $unwind: '$playersList' },"
                +"{ $match: { 'playersList.playerid':  { $ne: 'bob' } } },"
                +"{ $group: { _id: '$playersList.playerid', times: { $sum : 1} } },"
                +"{ $sort: { times: -1 } }"
                ).as(ResultObject.class);

class ResultObject{
  String _id;
  int times;
}

}

4

2 に答える 2

4

find/findOne のような集計機能を使用できます...結果は自動的に Pojo にアンマーシャリングされます:

List<Email> emails = collection.aggregate("{$project:{sender:1}}")
          .and("{$match:{tags:'read'}}")
          .and("{$limit:10}")
          .as(Email.class);

ここでさらに例を見つけることができます: https://github.com/bguerout/jongo/blob/master/src/test/java/org/jongo/AggregateTest.java

于 2013-03-24T15:15:06.460 に答える
0

この質問を見たばかりですが、他の人の助けになることを願っています。次のような内部クラスを作成できます。

private static class AggregateResult {
        String _id;
        int time;
    }

そして、次のように集計関数を呼び出します。

List<AggregateResult> res =  gamesCollection.aggregate(
                "{ ... }"
                ).as(AggregateResult.class);

その後、res リスト内の結果を反復処理できます。

于 2014-08-21T16:34:10.427 に答える