繁体   English   中英

mongo-db聚合查询可在mongo shell上运行,但不适用于Java程序

[英]mongo-db Aggregation query working on mongo shell but not in java program

我正在做一个项目,在我的mongo数据库中有大量收藏。 现在,我必须从mongo db中获得一些细节,这些细节非常像SQL group by子句。 我在mongo shell上成功执行了查询:

    > db.votes.aggregate(
    ... { $group : {
    ... _id : "vote_post_id",
    ... votesPerId : { $sum : 1 }
    ... }}
    ... );
    {
"result" : [
            {
                    "_id" : "vote_post_id",
                    "votesPerId" : 27371750
            }
    ],
    "ok" : 1

    }
    >

现在,当从Java程序图中执行查询时,我面临以下错误:

    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程序,它正在产生与我在mongo shell上写的内容完全相同的查询:

    { "$group" : { "_id" : "$vote_post_id" , "count" : { "$sum" : 1}}}

对于这个问题,我已经获得了很多答案,但似乎没有一个可以解决这个问题。

我的Java代码用于创建聚合函数:

//创建管道操作,首先使用$ match DBObject match = new BasicDBObject(“ $ match”,new 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中的查询相同,它是:

// $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());

在您的shell查询中

_id : "vote_post_id",

但是在您的Java查询中

"_id", "$vote_post_id"

区别在于美元符号。 $vote_post_id替换了该字段的值以用作存储桶键,而vote_post_id仅使用该文字值(因此只有一个存储桶)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM