如何使用java对mongo集合中的值求和?

如何使用java对mongo集合中的值求和?,java,mongodb,aggregation-framework,Java,Mongodb,Aggregation Framework,我正在使用java和mongoDB 在包含4个文档的mongo集合中,我有如下数据 _id, name, key1, key2, status 我想使用java查询该集合,该集合返回所有四个文档的“key1”之和,其中状态为1 如何编写查询以获取键1的和 以下是我的解决方法: BasicDBObject match = new BasicDBObject(); match.put("status", 1); pipeline.add(new BasicDBObject

我正在使用java和mongoDB

在包含4个文档的mongo集合中,我有如下数据

_id, name, key1, key2, status
我想使用java查询该集合,该集合返回所有四个文档的“key1”之和,其中状态为1

如何编写查询以获取键1的和

以下是我的解决方法:

BasicDBObject match = new BasicDBObject();
        match.put("status", 1);

    pipeline.add(new BasicDBObject("$match",match));
    pipeline.add(new BasicDBObject("$group",new BasicDBObject("_id", null).append(
                "total", new BasicDBObject( "$sum", "$totInOutOctets" ))));
    cmdBody.put("pipeline", pipeline);

// Put db command for execution in json array
    networkCapacityTrending.put(db.command(cmdBody));
MongoDB确实有一个可以使用的.group方法,但实际上这更像是mapReduce方法的包装器,更好的现代方法是使用

甚至在不首先匹配文档的情况下:

db.collection.agregate([
    { "$group": {
        "_id": null,
        "total": { 
            "$sum": {
                "$cond": [ 
                    { "$eq": [ "$status", 1 ] },
                    "$key1"
                    0,
                ]
            }
        }
    }}
])  
对于Java驱动程序,您实际上只是在构造DBObject类型。通过解析一些简单的东西,如所示的JSON,或者通过编程:

BasicDBObject match = new BasicDBObject(
    "$match", new BasicDBObject("status", 1)
);

BasicDBObject group = new BasicDBObject(
    "$group", new BasicDBObject("_id", null).append(
        "total", new BasicDBObject( "$sum", "$key1" )
    )
);

DBCollection collection = db.getCollection("mycollection");
AggregationOutput output = collection.aggregate(match,group);
请大致查看文档中的,以了解您可能熟悉的事物以及如何实现它们的基本概述


另请参见

我从集合中获取了状态为1的所有数据,并通过迭代游标将key1添加到变量中以获取sum@user3322141您正在尝试使用db.command方法提交聚合管道文档。您需要集合上的.aggregate方法。答案中给出的代码非常清楚。为什么group语句中的_id为null???@user3322141它意味着将所有内容分组,而不是按字段的特定值分组。所以你要的是所有的文件。其他条件过滤状态。这些链接是为了帮助您,因为wellbut收集方法已被弃用,如果我以不同的方式使用相同的方法,它将以0@user3322141此处使用的集合是指从数据库中获取的集合的对象。aggregate是基于此的方法。实际上,这将在左侧返回一个result DBObject。在清单中澄清了这一点。同样,这些链接是用来指导你的新事物的。
BasicDBObject match = new BasicDBObject(
    "$match", new BasicDBObject("status", 1)
);

BasicDBObject group = new BasicDBObject(
    "$group", new BasicDBObject("_id", null).append(
        "total", new BasicDBObject( "$sum", "$key1" )
    )
);

DBCollection collection = db.getCollection("mycollection");
AggregationOutput output = collection.aggregate(match,group);