0

我用 Java 编写了这个 MongoDB 查询:

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) 

请帮我找出错误。

4

1 回答 1

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));
于 2016-08-09T09:26:21.377 回答