6

以下のクエリで

{ $group : {
        _id :  { success:'$success', responseCode:'$responseCode', label:'$label'},
        max_timeStamp : { $timeStamp : 1 },
        count_responseCode : { $sum : 1 },
        avg_value : { $sum : "$value" },
        count_success : { $sum : 1 }
    }}

_id : { success:'$success', responseCode:'$responseCode', label:'$label'},Java mongodb ドライバーで使用するように変換する方法 。

私は試した

BasicDBList list = new BasicDBList();
list.add(new BasicDBObject("success", "$success"));
list.add(new BasicDBObject("responseCode", "$responseCode"));
list.add(new BasicDBObject("label", "$label"));
AggregationOutput output = collection.aggregate(match, project, group); 

多次元配列

String [][] muitiGroupBy = {{"success", "$success"},{"responseCode", "$responseCode"},{"label", "$label"}};

等..

しかし、私は常に結果としてこのようになります

"_id" : [ { "success" : "$success"} , { "responseCode" : "$responseCode"}]

フィールドを 1 つだけ使用すると機能します。

DBObject groupFields = new BasicDBObject( "_id", new BasicDBObject("success", "$success"));

4

3 に答える 3

6

私たちはその方法を理解しました。これを使用して達成できます。

Map<String, Object> dbObjIdMap = new HashMap<String, Object>();
dbObjIdMap.put("success", "$success");
dbObjIdMap.put("responseCode", "$responseCode");
dbObjIdMap.put("label", "$label");
DBObject groupFields = new BasicDBObject( "_id", new BasicDBObject(dbObjIdMap));
于 2013-03-25T07:06:20.227 に答える
4

私にも同様のニーズがあり、2013 年の titogeo の回答は、集計操作を Java クライアントが処理できるものに変換しようとして何度も失敗した後、正しい方向に導いてくれました。これは私が使用したものです:

MongoCollection<Document> myCollection = myDB.getCollection("myCollection");

Map<String, Object> multiIdMap = new HashMap<String, Object>();
multiIdMap.put("groupField1", "$groupField1");
multiIdMap.put("groupField2", "$groupField2");

Document groupFields = new Document(multiIdMap);
AggregateIterable<Document> aggregate = myCollection.aggregate(Arrays.asList(
        Aggregates.group(groupFields,
                Accumulators.last("lastDate", "$dateCreated"),
                Accumulators.last("lastNumAvail", "$availableUnits")
                )
        ));

これからの結果と一致させるために必要なものを正確に返しました:

db.myCollection.aggregate([
            {"$group":{ "_id":{
                groupField1: "$groupField1", 
                groupField2: "$groupField2"}, 
                lastDate: 
                    {"$last":"$dateCreated"}, 
                lastNumAvail: 
                    {"$last":"$availableUnits"}
                }
               }                
            ]);
于 2018-09-05T20:22:44.977 に答える
0

このコード (grails コードと mongo-java-driver-3.2) を使用してこれを実現できます。

DBObject groupFields = new BasicDBObject()
groupFields.put('success', "\$success")
groupFields.put('responseCode', "\$responseCode")
groupFields.put('label', "\$label")
def result = collection.aggregate(Arrays.asList(Aggregates.group(groupFields, []))).iterator()
于 2016-03-05T19:48:07.240 に答える