如何在Java中实现MongoDB聚合
我有以下工作的MongoDB聚合shell命令:如何在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 } } }
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;