2016-07-05 2 views
1

mongo-java 드라이버를 사용하여 Java에서 집계 연산을 수행하려고합니다. 나는 다른 찾기 작업을 수행했지만, 나는 자바에서 올바르게 다음 집계를 할 수없는 해요 :다중 필드가있는 java : group의 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}} 
]) 

내가 자바로 그 집계를 수행하는 여러 가지 방법과 방법을 시도했습니다,하지만 난 수 없어요 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 (1, 2)에 대한 사용 가능한 문서는 나에게 너무 짧으며이 경우는 포함되지 않습니다.

어떻게 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 } 

대신 키 - 값의 목록을 만들려고 노력의 , 나는 요소들을 문서들에 추가했다. 희망은 누군가에게 유용 할 것입니다!

관련 문제