当前位置: 首页 > 知识库问答 >
问题:

如何在Mongodb java驱动程序中编写多个group by id字段

严元白
2023-03-14

在下面的查询中

{ $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(“\u id”,new BasicDBObject(“success”,“$success”));

共有3个答案

戚阳文
2023-03-14

我可以通过以下代码实现这一点(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()
庄文栋
2023-03-14

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

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"}
                }
               }                
            ]);
邬弘化
2023-03-14

我们确实想出了办法。我们可以用这个来实现。

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));
 类似资料:
  • 我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将这个管道与java驱动程序一起使用。MongoDB v4.0.3 我使用MongoDB Compass创建了以下管道(减少到重要部分): 这导致以下(生成的)Java代码: 集合中$组阶段之前的数据如下所示: $组阶段应返回以下数据结构: 问题所在 Mongo Compass按预期预览了阶段的结果,但使用java驱动程序的阶段的结果非常

  • 我目前正在为Mac开发打印机驱动程序,它应该支持PS(postscript)和PCL打印机。我已经有了支持PS的想法(通过在PPD和PDE中定义自定义CUPS postscript过滤器)。 我不知道的是支持PCL打印机。 a) CUPS是否自动支持PCL? b)如果a)的答案为YES,则在打印到PCL打印机时会调用我的PS过滤器吗?(我在PS过滤器中的打印数据中添加一些PJL)。 c)如果a)的

  • 我试图重写Spark的默认,但运气不好。我尝试将以下内容添加到Spark-Submit中: 但那似乎不起作用。我还尝试在中使用选项,但似乎也不起作用。是否有人设置了日志记录,所以每个驱动程序都有文件,而不使用默认值?

  • 问题内容: 我需要从头开始为omap4编写SPI Linux字符设备驱动程序。我知道编写设备驱动程序的一些基础知识。但是,我不知道如何从头开始编写平台特定的设备驱动程序。 我已经编写了一些基本的char驱动程序,并且我认为编写SPI设备驱动程序将与此类似。Char驱动程序的结构包含在驱动程序中实现的功能。 现在,我将以spi-omap2-mcspi.c代码作为参考,以获取从零开始开发SPI驱动程序

  • 我对蒙哥有点陌生。我想在一个字段上查询多个值。在SQL中,我想要这样的内容: 但这似乎只返回“bar”文档。 请帮忙

  • 问题内容: 我正在尝试找到可以与Go一起使用的MySql驱动程序,该驱动程序支持在一个调用中发出多个SQL语句。例如,我可能希望使用以下SQL创建数据库: 在PHP之类的语言中,您可以将两个SQL语句放在一个字符串中,然后一次性执行,如下所示: 我需要这个的原因是因为我有SQL转储(来自),我想以编程方式应用于各种数据库。 我在Go中寻找相同的功能,但似乎所有不同的驱动程序都不支持它,坦率地说,这