我有以下工作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);
}
我得到一个例外:
mongodb匹配过滤器必须是对象中的表达式 .
你能帮我识别一下上面代码中的错误吗?谢谢!
3 回答
尝试打印
aggregationInput
的值,您将意识到.put()
不返回BasicDBObject
,而只返回与您更新的密钥关联的先前值 . 因此,当你这样做时:您实际上将
$match
设置为null
,因为new BasicDBObject().put("_id",new ObjectId(clientId))
返回null
.将代码更新为:
或者,稍微更具可读性,使用流利的
BasicDBObjectBuilder
:它应该工作正常 .
每个
{}
必须是新的DBObject
. 使用.append(key,value)
方法也可以更优雅 .试试这个:
这是最终的工作版本,基于以上建议//使用mongodb聚合框架来确定关注者的数量Integer returnCount = 0;列出aggregationInput = new ArrayList();