2013-03-13 140 views
0

我正在一個項目中,我有一個巨大的收藏在我的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()); 
+1

請檢查你的價值觀,因爲是第一次有一個聚集查詢,在Java代碼中使用的是其他聚集查詢, 「調試查詢」也不同。 – n1ckolas 2013-03-13 09:51:25

回答

0

在你的shell查詢你正在做

_id : "vote_post_id", 

但在Java查詢你正在做

"_id", "$vote_post_id" 

不同的是美元符號。 $vote_post_id將該字段的值替換爲用作存儲鍵的鍵,而vote_post_id只是使用該字面值(因此只有一個存儲桶)。

1

爲了讓您查詢作爲殼這將是相同的:

// $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()); 
相關問題