2016-07-05 59 views
1

我想在Java中使用mongo-java-driver执行聚合操作。我已经进行了一些其他的查找操作,但我无法正确地做到以下几点聚集在Java中:在Java中的Mongo聚合:具有多个字段的组

db.I1.aggregate([ 
    { "$match": { "ci": 862222} }, 
    { "$match": { "gi": { "$ne": null } }}, 
    { "$group": { 
     "_id": { 
      "ci": "$ci", 
      "gi": "$gi", 
      "gn": "$gn", 
      "si": "$si" 
     } 
    }}, 
    { "$group": { 
     "_id": { 
      "ci": "$_id.ci", 
      "gi": "$_id.gi", 
      "gn": "$_id.gn" 
     }, 
     "sn": { "$sum": 1 } 
    }}, 
    { "$sort" : { "_id.gi" : 1}} 
]) 

我尝试了多种方法和方法在Java执行聚集,但我不能在coll.aggregate(asList())方法中正确包含组字段"ci", "gi", "gn","si"。我得到了什么,到目前为止,如下:

MongoCollection<Document> coll = mongo.getCollection("I1"); 

Document matchCourse = new Document("$match", 
    new Document("ci", Integer.parseInt(courseid))); 

Document matchGroupNotNull = new Document("$match", 
    new Document("gi", new Document("$ne", null))); 

List<Object> list1 = new BasicDBList(); 
    list1.add(new BasicDBObject("ci", "$ci")); 
    list1.add(new BasicDBObject("gi", "$gi")); 
    list1.add(new BasicDBObject("gn", "$gn")); 
    list1.add(new BasicDBObject("si", "$si")); 

Document group1 = new Document(
    "_id", list1).append("count", new Document("$sum", 1)); 

List<Object> list2 = new BasicDBList(); 
list2.add(new BasicDBObject("ci", "$_id.ci")); 
list2.add(new BasicDBObject("gi", "$_id.gi")); 
list2.add(new BasicDBObject("gn", "$_id.gn")); 

Document group2 = new Document(
    "_id", list2).append("sn", new Document("$sum", 1)); 

Document sort = new Document("$sort", 
    new Document("_id.gi", 1)); 

AggregateIterable<Document> iterable = coll.aggregate(asList(matchCourse, 
    matchGroupNotNull, group1, group2, sort)); 

我知道这是不正确的,但我把它给你的我在做什么的想法。我用许多不同的方式搜索了这个内容,并阅读了几页,但我没有找到任何解决方案。 MongoDB-Java的可用文档(12)对我来说太短,并且不包括这种情况。

如何在Java中执行该查询?任何帮助,将不胜感激。

非常感谢!

回答

5

终于我找到了解决办法。有在我张贴的问题一些错误,因为它是达到了绝望的某一点后的最后一次尝试,但最后,这里是最终的解决方案:

MongoDatabase mongo = // initialize your connection; 
Document matches = new Document("$match", 
    new Document("gi", new Document("$ne", null)) 
    .append("ci", Integer.parseInt(courseid))); 

Document firstGroup = new Document("$group", 
    new Document("_id", 
     new Document("ci", "$ci") 
     .append("gi", "$gi") 
     .append("gn", "$gn") 
     .append("si", "$si")) 
    .append("count", new Document("$sum", 1))); 

Document secondGroup = new Document("$group", 
    new Document("_id", 
     new Document("ci", "$_id.ci") 
     .append("gi", "$_id.gi") 
     .append("gn", "$_id.gn")) 
    .append("ns", new Document("$sum", 1))); 

Document sort = new Document("$sort", 
    new Document("_id.gi", 1));    

List<Document> pipeline = Arrays.asList(matches, firstGroup, 
    secondGroup, sort); 
AggregateIterable<Document> cursor = mongo.getCollection("I1") 
    .aggregate(pipeline); 

for(Document doc : cursor) { // do stuff with doc } 

而不是试图创建键值的列表,我只是将这些元素添加到文档中。希望它对别人有用!