2016-07-05 57 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 } 

而不是試圖創建鍵值的列表,我只是將這些元素添加到文檔中。希望它對別人有用!