2014-01-23 60 views
0

我想用蒙戈聚集在Java中,但我不能確定$group代碼:

在javascript中:

$group = { 
     '_id':null, 
     'money_bank':{ 
      '$sum':{ 
       '$cond':[{'$eq'=>{'$type':'bank'}},'$amount',0] 
      } 
      } 

在java中:

BasicDBList eqList = new BasicDBList(); 
eqList.add("$type"); 
eqList.add("bank"); 
DBObject eqObject = BasicDBObjectBuilder.start().add("$eq", eqList).get(); 

BasicDBList condList = new BasicDBList(); 
condList.add(eqObject); 
condList.add("$amount"); 
condList.add(0); 
DBObject conObj = BasicDBObjectBuilder.start().add("$cond", condList).get(); 
DBObject sumObj = BasicDBObjectBuilder.start().add("$sum", conObj).get(); 
DBObject moneyObj = BasicDBObjectBuilder.start().add("money_bank", sumObj).get(); 
DBObject idObj = BasicDBObjectBuilder.start().add("_id", null).get(); 
BasicDBList groupList = new BasicDBList(); 
groupList.add(idObj); 
groupList.add(moneyObj); 
DBObject group = new BasicDBObject("$group", groupList); 

但是,當我執行的代碼,錯誤:

"errmsg" : "exception: a group's fields must be specified in an object" 

請幫我用Java。

回答

0

你稍微誤解了把它變成Java調用的正確方法,你已經使用了BasicDBList的兩個地方實際上需要使用BasicDBObject來代替 - 這就是錯誤的含義,這意味着你需要使用一個對象而不是列表。

我已經對您的代碼進行了更改,但是我沒有針對MongoDB進行過測試,因此我將其保留給您。

給你的JavaScript相當於所需的最小的變化是:

BasicDBObject eqArgs = new BasicDBObject("$type", "bank"); 
DBObject eqObject = BasicDBObjectBuilder.start().add("$eq", eqArgs).get(); 

BasicDBList condList = new BasicDBList(); 
condList.add(eqObject); 
condList.add("$amount"); 
condList.add(0); 
DBObject conObj = BasicDBObjectBuilder.start().add("$cond", condList).get(); 
DBObject sumObj = BasicDBObjectBuilder.start().add("$sum", conObj).get(); 
BasicDBObject groupArgs = new BasicDBObject(); 
groupArgs.append("_id", null); 
groupArgs.append("money_bank", sumObj); 
DBObject group = new BasicDBObject("$group", groupArgs); 

// Using an assert to check it's correct, remove in production code 
Assert.assertThat(group.toString(), is("{ \"$group\" : { \"_id\" : null , " + 
                 "\"money_bank\" : { " + 
                  "\"$sum\" : { " + 
                   "\"$cond\" : [ { \"$eq\" : { \"$type\" : \"bank\"}} , " + 
                   "\"$amount\" , 0]" + 
                  "}" + 
                 "}" + 
                 "}" + 
             "}")); 

但是可以將其簡化甚至更多(儘管我承認Java是仍然比JavaScript的醜陋):

BasicDBList condList = new BasicDBList(); 
condList.add(new BasicDBObject("$eq", new BasicDBObject("$type", "bank"))); 
condList.add("$amount"); 
condList.add(0); 
DBObject sumObj = new BasicDBObject("$sum", new BasicDBObject("$cond", condList)); 
DBObject group = new BasicDBObject("$group", new BasicDBObject("_id", null).append("money_bank", sumObj)); 

由於某些原因,BasicDBObjectBuilder比使用BasicDBObject更加冗長。

+1

我建議使用com.mongodb.util.JSON.parse函數,並在查詢中傳入以獲得DBObject而不會有任何痛苦:) – Sikorski

+0

這是在執行字符串操作,它仍然會有可怕的表現。 – Trisha

+0

@ Trisha,謝謝,但是當我使用$或$ cond運行但返回不正確的結果。請幫助我$組中的代碼:PHP代碼是:$ group = array( '_id'=> null, 'sms_card'=> array( '$ sum'=> array( '$ cond'=>數組( array( '$ or'=> array( array('$ eq'=> array('$ type','sms')), array('$ eq'=> array('$ type '''')) )),'$ amount',0) ) ) –