2016-06-13 52 views
0

我在我的MongoDB中有80,000個文檔。我正在使用Java驅動程序查詢這些文檔。我試圖根據特定字段對我的文檔進行分類,然後對此結果應用不同的過濾器。排序選項工作正常,但我不能得到不同的文件。我附上了我的工作示例。在Java中排序並區分Mongodb 3.2

Document query = new Document("RetweetCount",-1); 
    MongoCursor<Document> cursor = collection.find().sort(query).iterator(); 
    try{ 
    while(cursor.hasNext()) { 
     Document dr = (Document) cursor.next(); 
     String stat = dr.getString("status"); 
     int retweetcount = dr.getInteger("RetweetCount"); 
     //Sort works fine. I have to apply distinct here!!! distinct is based on status field 
     System.out.println(retweetcount+"--->"+stat); 
    } 
    }finally{ 
     cursor.close(); 
    } 
} 
+0

你看看http://api.mongodb.com/java/3.2/com/mongodb/operation/DistinctOperation.html如果你給我你的樣本數據庫我可以做一點點計算出 – Newton

+0

@Netwon ,我的數據庫結構是這樣的{status:x,retweetcount:2},{status:y,retweetcount:5},{status:x,retweetcount:3}。每次以新狀態和其轉發計數存儲時。我必須得到狀態的頂部retweetcount,但我有我的數據庫重複狀態。我想獲得狀態:x和retweetcount:3,該狀態的retweetcount最高。 – prabhu

+0

你可以寄回你的藏品嗎? – Newton

回答

0

我試過這個方法,但是它提取了一些不相關的字段。 I referred this link

ArrayList<Document> dd = new ArrayList<Document>(); 
    //MongoCursor<Document> cursor1 = collection.find().sort(query).iterator(); 

    Document grouping = new Document("_id","$status"); 
    grouping.append("text", new Document("$first","$_id")); 
    grouping.append("RetweetCount", new Document("$first","$RetweetCount")); 
    grouping.append("screen_name", new Document("$first","screen_name")); 
    Document group = new Document("$group",grouping); 
    System.out.println(group); 

    Document sortfields = new Document("RetweetCount",-1); 
    Document sort = new Document("$sort",sortfields); 

    Document projectfields = new Document("_id",0); 
    projectfields.append("_id", "$text"); 
    projectfields.append("RetweetCount", "$RetweetCount"); 
    projectfields.append("sn", "$screen_name"); 
    Document projects = new Document("$project",projectfields); 



    AggregateIterable<Document> iterable = collection.aggregate(asList(new Document(group),new Document(sort),new Document(projects))); 
    iterable.forEach(new Block<Document>() { 
     @Override 
     public void apply(final Document document) { 
      System.out.println(document.toJson()); 
     } 
    }); 

輸出:

{ "_id" : { "$oid" : "576124fafbfb870794452ac6" }, "RetweetCount" : 643, "sn" : "screen_name" } 

它忽略我的文本字段,而不是它的id字段返回。我的轉推訂單也不正確。 此方法正常工作,但結果不同。 任何人都可以請糾正我!

+0

我得到了解決方案。 – prabhu