Betty
Betty

Reputation: 31

group and sum in aggregation with MongoDB Java Driver

I wrote this MongoDB query in Java:

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

and the code is

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

It gives the error

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) 

Please help me to figure out the error.

Upvotes: 0

Views: 3253

Answers (1)

Mr Tarsa
Mr Tarsa

Reputation: 6652

In your code

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

is analogue of

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

but instead what you need is

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

so the first query will be

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

while the second

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

Upvotes: 1

Related Questions