2016-06-13 2 views
0

У меня 80 000 документов в моем mongodb. Я запрашиваю эти документы с помощью драйвера Java. Я попытался отсортировать документы на основе определенного поля, а затем применить к этому результату отдельный фильтр. Функция сортировки работает нормально, но я не могу получить отдельные документы. Я приложил свои примеры работы.Сортировка и отличие Mongodb в Java 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, если вы дадите мне ваш образец db, я могу немного вычислить его – Newton

+0

@Netwon , Моя структура db похожа на {status: x, retweetcount: 2}, {status: y, retweetcount: 5}, {status: x, retweetcount: 3}. Каждый раз он сохраняет новый статус и его retweetcount. Я должен получить верхний статус retweetcount для статуса, но у меня есть дублирующий статус в моем db. Я хочу получить статус: 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" } 

Он опускает мой текстовое поле вместо этого он возвращается с поля ид. Также мой ретвитт был неправильным. Этот метод работает отлично, но результат отличается. Может кто-нибудь, пожалуйста, поправьте меня !!!

+0

У меня есть решение. – prabhu

Смежные вопросы