【问题标题】:How to write multiple group by id fields in Mongodb java driver如何在Mongodb java驱动程序中编写多个group by id字段
【发布时间】:2013-03-22 06:59:37
【问题描述】:

在下面的查询中

{ $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"}]

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

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

【问题讨论】:

    标签: mongodb aggregation-framework mongodb-java


    【解决方案1】:

    我们确实想出了办法。我们可以使用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));
    

    【讨论】:

      【解决方案2】:

      在多次尝试将我的聚合操作转换为 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"}
                      }
                     }                
                  ]);
      

      【讨论】:

        【解决方案3】:

        我可以通过这段代码(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()
        

        【讨论】:

        • 对于 Java 驱动程序 3+,应使用 Document 类而不是 BasicDBObject
        猜你喜欢
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        相关资源
        最近更新 更多