0

我寫的Java這樣的MongoDB查詢:組,總和與MongoDB的Java驅動程序聚集

db.collection.aggregate(
    { $group : { 
     _id : { "category" : "$category", "type" : "$type" }, 
     number : { $sum : 1 } 
    } }, 
    { $group : { 
     _id : "$_id.category", 
     number : { $sum : 1 } 
    } } 
) 

而且代碼

DBObject group1 = new BasicDBObject(); 
group1.put("_id", new BasicDBObject("invoiceNo", "$invoiceNo") 
     .append("invoiceDate", "$invoiceDate") 
     .append("count", new BasicDBObject("$sum",1))); 

DBObject group2 = new BasicDBObject(); 
group2.put("_id", new BasicDBObject("invoiceNo", "$_id.invoiceNo") 
     .append("count", new BasicDBObject("$sum",1))); 

AggregationOutput output = dummyColl.aggregate(new BasicDBObject("$group", group1), 
     new BasicDBObject("$group", group2)); 

它給人的錯誤

com.mongodb.CommandFailureException: { "serverUsed" : "localhost/127.0.0.1:27017" , "errmsg" : "exception: invalid operator '$sum'" , "code" : 15999 , "ok" : 0.0} 
at com.mongodb.CommandResult.getException(CommandResult.java:71) 
at com.mongodb.CommandResult.throwOnError(CommandResult.java:110) 
at com.mongodb.DBCollection.aggregate(DBCollection.java:1308) 

請幫我弄清楚錯誤。

+0

你MongoDB的外殼查詢和Java代碼中是完全不同的,你有你的管道組不同的密鑰。 – chridam

回答

1

在你的代碼

group1.put("_id", new BasicDBObject("invoiceNo", "$invoiceNo") 
    .append("invoiceDate", "$invoiceDate") 
    .append("count", new BasicDBObject("$sum",1))); 

$group: { 
    "_id": 
    { 
     "invoiceNo": "$invoiceNo", 
     "invoiceDate": "$invoiceDate", 
     "count": { "$sum", 1 } 
    } 
} 

模擬,而是你需要的是

$group: { 
    "_id": { "invoiceNo": "$invoiceNo", "invoiceDate": "$invoiceDate" }, 
    "count": { "$sum", 1 } 
} 

所以第一個查詢將是

group1.put("_id", new BasicDBObject("invoiceNo", "$invoiceNo") 
    .append("invoiceDate", "$invoiceDate"); 
group1.put("count", new BasicDBObject("$sum", 1)); 

而第二

group2.put("_id", new BasicDBObject("invoiceNo", "$_id.invoiceNo")); 
group2.put("count", new BasicDBObject("$sum", 1));