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 }
    }}

java mongodb驱动中如何 _id : { success:'$success', responseCode:'$responseCode', label:'$label'},编译才能使用。

我试过

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"}};

ETC..

但我总是得到这样的结果

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

如果我只使用一个字段,它会起作用。

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

4

3 回答 3

6

我们确实想出了办法。我们可以通过使用this来实现。

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

在多次尝试将我的聚合操作转换为 Java 客户端可以处理的操作失败后,我有类似的需求,并且从 2013 年开始,titogeo 的回答引导我朝着正确的方向前进。这是我使用的:

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 回答