0

Я написал этот запрос MongoDB в Java:группы и сумма в агрегате с MongoDB Java Driver

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));