mongo-db聚合查询工作在mongo shell但不在java程序中
问题描述:
我正在一个项目中,我有一个巨大的收藏在我的mongo数据库中。现在我必须从mongo db中得到一些细节,像SQL group by子句那样非常熟悉。而从Java proggram执行查询我面临的follwing错误mongo-db聚合查询工作在mongo shell但不在java程序中
> db.votes.aggregate(
... { $group : {
... _id : "vote_post_id",
... votesPerId : { $sum : 1 }
... }}
...);
{
"result" : [
{
"_id" : "vote_post_id",
"votesPerId" : 27371750
}
],
"ok" : 1
}
>
现在:我成功地执行在蒙戈外壳查询
Exception in thread "main" com.mongodb.CommandResult$CommandFailure: command
failed [aggregate]: { "serverUsed" : "localhost/127.0.0.1:27017" ,
"errmsg" : "exception: aggregation result exceeds maximum document size (16MB)"
, "code" : 16389 , "ok" : 0.0}
at com.mongodb.CommandResult.getException(CommandResult.java:88)
at com.mongodb.CommandResult.throwOnError(CommandResult.java:134)
at com.mongodb.DBCollection.aggregate(DBCollection.java:1311)
at main.Connetion.CheckConnection.GetNoOfVotesForAType(CheckConnection.java:210)
at main.DAO.Votes.VoteDAO.findKeyWord(VoteDAO.java:109)
at main.DAO.Votes.VoteDAO.main(VoteDAO.java:139)
我已经调试我的Java程序,它是生产的确切查询我的蒙戈外壳写道:
{ "$group" : { "_id" : "$vote_post_id" , "count" : { "$sum" : 1}}}
我经历过很多关于这个问题,没有答案似乎解决了问题。
用于创建聚合功能我的Java代码:与$匹配
//创建我们的流水线作业,第一 DBOBJECT匹配=新BasicDBObject( “$匹配”,新BasicDBObject( “vote_type_id”,“1 “));
// build the $projection operation
DBObject fields = new BasicDBObject("vote_post_id", 1);
fields.put("_id", 0);
DBObject project = new BasicDBObject("$project", fields);
// Now the $group operation
DBObject groupFields = new BasicDBObject("_id", "$vote_post_id");
groupFields.put("count", new BasicDBObject("$sum", 1));
DBObject group = new BasicDBObject("$group", groupFields);
// run aggregation
AggregationOutput output = votesCollection.aggregate(match, project, group);
System.out.println(output.getCommandResult());
答
在你的shell查询你正在做
_id : "vote_post_id",
但在Java查询你正在做
"_id", "$vote_post_id"
不同的是美元符号。 $vote_post_id
将该字段的值替换为用作存储键的键,而vote_post_id
只是使用该字面值(因此只有一个存储桶)。
答
为了让您查询作为壳这将是相同的:
// $group operation
DBObject groupFields = new BasicDBObject("_id", "vote_post_id");
groupFields.put("votesPerId", new BasicDBObject("$sum", 1));
DBObject group = new BasicDBObject("$group", groupFields);
// run aggregation
AggregationOutput output = votesCollection.aggregate(group);
System.out.println(output.getCommandResult());
请检查你的价值观,因为是第一次有一个聚集查询,在Java代码中使用的是其他聚集查询, “调试查询”也不同。 – n1ckolas 2013-03-13 09:51:25