Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中实现MongoDB聚合_Java_Mongodb_Mongodb Query_Mongodb Java - Fatal编程技术网

如何在Java中实现MongoDB聚合

如何在Java中实现MongoDB聚合,java,mongodb,mongodb-query,mongodb-java,Java,Mongodb,Mongodb Query,Mongodb Java,我有以下工作的MongoDB聚合shell命令: db.followrequests.aggregate([{ $match: { _id: ObjectId("551e78c6de5150da91c78ab9") } }, { $unwind: "$requests" }, { $group: { _id: "$_id", count: { $sum: 1 } } }

我有以下工作的MongoDB聚合shell命令:

db.followrequests.aggregate([{
    $match: {
        _id: ObjectId("551e78c6de5150da91c78ab9")
    }
}, {
    $unwind: "$requests"
}, {
    $group: {
        _id: "$_id",
        count: {
            $sum: 1
        }
    }
}]);
返回:

{“_id”:ObjectId(“551e78c6de5150da91c78ab9”),“count”:7}

我需要用Java实现这一点,我正在尝试以下方法:

List<DBObject> aggregationInput = new ArrayList<DBObject>();

BasicDBObject match = new BasicDBObject();
match.put("$match", new BasicDBObject().put("_id",new ObjectId(clientId)));
aggregationInput.add(match);

BasicDBObject unwind = new BasicDBObject();
unwind.put("$unwind", "$requests");
aggregationInput.add(unwind);

BasicDBObject groupVal = new BasicDBObject();
groupVal.put("_id", "$_id");
groupVal.put("count", new BasicDBObject().put("$sum", 1));

BasicDBObject group = new BasicDBObject();
group.put("$group", groupVal);
aggregationInput.add(group);

AggregationOutput output = followRequestsCol.aggregate(aggregationInput);
for (DBObject result : output.results()) {
    System.out.println(result);
}
List aggregationput=new ArrayList();
BasicDBObject匹配=新的BasicDBObject();
match.put(“$match”,newBasicDBObject().put(“\u id”,newObjectId(clientId)));
添加(匹配);
BasicDBObject展开=新的BasicDBObject();
放回(“$unwind”,“$requests”);
聚合输入。添加(展开);
BasicDBObject groupVal=新的BasicDBObject();
groupVal.put(“\u id”,“$\u id”);
groupVal.put(“count”,新的BasicDBObject().put(“$sum”,1));
BasicDBObject组=新的BasicDBObject();
group.put(“$group”,groupVal);
聚合输入。添加(组);
AggregationOutput输出=followRequestsCol.aggregate(aggregationInput);
for(DBObject结果:output.results()){
系统输出打印项次(结果);
}
我得到一个例外:

mongodb匹配筛选器必须是对象中的表达式


你能帮我找出上面代码中的错误吗。谢谢

尝试打印
aggregationput
的值,您会发现
.put()
不会返回
BasicDBObject
,而只返回与您更新的键关联的上一个值。因此,当您这样做时:

match.put("$match", new BasicDBObject().put("_id",new ObjectId(clientId)));
实际上,您正在将
$match
设置为
null
,如
新建基本对象()。put(“\u id”,new ObjectId(clientId))
返回
null

将代码更新为类似以下内容:

List <DBObject> aggregationInput = new ArrayList <DBObject> ();

BasicDBObject match = new BasicDBObject();
BasicDBObject matchQuery = new BasicDBObject();
matchQuery.put("_id", new ObjectId());
match.put("$match", matchQuery);
aggregationInput.add(match);

BasicDBObject unwind = new BasicDBObject();
unwind.put("$unwind", "$requests");
aggregationInput.add(unwind);

BasicDBObject groupVal = new BasicDBObject();
groupVal.put("_id", "$_id");
groupVal.put("count", new BasicDBObject().put("$sum", 1));

BasicDBObject group = new BasicDBObject();
group.put("$group", groupVal);
aggregationInput.add(group);

AggregationOutput output = followRequestsCol.aggregate(aggregationInput);
for (DBObject result : output.results()) {
    System.out.println(result);
}

而且它应该可以正常工作。

每个
{}
都必须是新的
DBObject
。还可以使用
.append(key,value)
方法使其更加优雅

试试这个:

List<DBObject> pipeline = new ArrayList<DBObject>(Arrays.asList(
    new BasicDBObject("$match", new BasicDBObject("_id", 
        new ObjectId("551e78c6de5150da91c78ab9"))), 
    new BasicDBObject("$unwind", "$requests"),
    new BasicDBObject("$group", 
        new BasicDBObject("_id","$_id").append("count", new BasicDBObject("$sum", 1)))));

AggregationOutput output = followRequestsCol.aggregate(pipeline);
for (DBObject result : output.results()) {
    System.out.println(result);
}
List pipeline=newarraylist(Arrays.asList(
新的BasicDBObject(“$match”),新的BasicDBObject(“\u id”,
新对象(“551e78c6de5150da91c78ab9”),
新的BasicDBObject(“$unwind”,“$requests”),
新的BasicDBObject($group),
新的BasicDBObject(“\u id”,“$\u id”)。追加(“count”,新的BasicDBObject(“$sum”,1“));
AggregationOutput输出=followRequestsCol.aggregate(管道);
for(DBObject结果:output.results()){
系统输出打印项次(结果);
}

这是基于上述建议的最终工作版本 //使用mongodb聚合框架确定跟随者的数量 整数returnCount=0; List aggregationput=new ArrayList()


太好了,非常感谢,很有效。只需对组val进行同样的计数。
List<DBObject> pipeline = new ArrayList<DBObject>(Arrays.asList(
    new BasicDBObject("$match", new BasicDBObject("_id", 
        new ObjectId("551e78c6de5150da91c78ab9"))), 
    new BasicDBObject("$unwind", "$requests"),
    new BasicDBObject("$group", 
        new BasicDBObject("_id","$_id").append("count", new BasicDBObject("$sum", 1)))));

AggregationOutput output = followRequestsCol.aggregate(pipeline);
for (DBObject result : output.results()) {
    System.out.println(result);
}
    BasicDBObject match = new BasicDBObject();
    BasicDBObject matchQuery = new BasicDBObject();
    matchQuery.put("_id", new ObjectId(clientId));
    match.put("$match", matchQuery);
    aggregationInput.add(match);

    BasicDBObject unwind = new BasicDBObject();
    unwind.put("$unwind", "$requests");
    aggregationInput.add(unwind);

    BasicDBObject groupVal = new BasicDBObject();
    groupVal.put("_id", null);
    BasicDBObject sum = new BasicDBObject();
    sum.put("$sum", 1);
    groupVal.put("count", sum);
    BasicDBObject group = new BasicDBObject();
    group.put("$group", groupVal);
    aggregationInput.add(group);

    AggregationOutput output = followRequestsCol.aggregate(aggregationInput);
    for (DBObject result : output.results()) {
        returnCount = (Integer) result.get("count");
        break;
    }
    return returnCount;