2016-10-19 2 views
2

Я пытаюсь получить данные из mongoDB без повторных значений. Я хочу отфильтровать следующие данныеКак фильтровать данные без повторных значений в mongodb с java

{"page":"www.abc.com","impressions":1,"position":144} 
{"page":"www.abc.com","impressions":1,"position":8} 
{"page":"www.xyz.com","impressions":7,"position":4} 
{"page":"www.pqr.com","impressions":1,"position":7} 
{"page":"www.abc.com","impressions":1,"position":19} 

для фильтрации следующим образом. любая идея, как мне это сделать?

{"page":"www.xyz.com","impressions":7,"position":4} 
{"page":"www.pqr.com","impressions":1,"position":7} 
+0

Поделитесь своим кодом Java, который это поможет. –

ответ

2

В Java для водителя MongoDB Java 3.0+ это может быть:

public static void main(String[] args) { 
    try (MongoClient client = new MongoClient("127.0.0.1")) { 
     MongoCollection<Document> col = client.getDatabase("test").getCollection("test"); 

     Document groupFields = new Document("_id", "$page"); 
     groupFields.put("count", new Document("$sum", 1)); 
     groupFields.put("impressions", new Document("$first", "$impressions")); 
     groupFields.put("position", new Document("$first", "$position")); 

     Document matchFields = new Document("count", 1); 

     Document projectFields = new Document("_id", 0); 
     projectFields.put("page", "$_id"); 
     projectFields.put("impressions", 1); 
     projectFields.put("position", 1); 

     AggregateIterable<Document> output = col.aggregate(Arrays.asList(
       new Document("$group", groupFields), 
       new Document("$match", matchFields), 
       new Document("$project", projectFields) 
     )); 

     for (Document doc : output) { 
      System.out.println(doc); 
     } 
    } 
} 

Выход для БД:

Document{{impressions=1.0, position=7.0, page=www.pqr.com}} 
Document{{impressions=7.0, position=4.0, page=www.xyz.com}} 
2

Вы должны быть в состоянии запустить трубопровод агрегации, который группирует документы по page поле с помощью оператора конвейера в $group, получить количество документов с помощью $sum оператора и сохранить другие два поля с использованием $first (или $last) Оператор.

предыдущий конвейер после $group должен быть в состоянии фильтровать сгруппированные документы на поле подсчета, т.е. отфильтровать дубликаты из результата. Для этого запроса используйте оператор трубопровода $match.

Окончательный косметический трубопровод будет включать в себя этап $project который перестраивает каждый документ в потоке, включают в себя, исключить или переименовать поля, впрыснуть вычисляемых полей, создания полей поддокументу, используя математические выражения, даты, строки и/или логические (сравнение, логические, управляющие) выражения.

Выполнить это объединение трубопровода, чтобы получить желаемый результат:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$page", 
      "count": { "$sum": 1 }, 
      "impressions": { "$first": "$impressions" }, 
      "position": { "$first": "$position" } 
     } 
    }, 
    { "$match": { "count": 1 } }, 
    { 
     "$project": { 
      "_id": 0, 
      "page": "$_id", 
      "impressions": 1, 
      "position": 1 
     } 
    } 
]) 
Смежные вопросы