2015-07-26 22 views
8

My MongoDB struktura JSON jestMongoDB mongoTemplate uzyskać odrębną dziedzinę z pewnymi kryteriami

{ 
    "_id" : "122134231234234", 
    "name" : "Total_pop", 
    "description" : "sales category", 
    "source" : "public", 
    "dataset" :"d1" 


}, 
{ 
    "_id" : "1123421231234234", 
    "name" : "Total_pop", 
    "description" : "sales category", 
    "source" : "public", 
    "dataset" :"d1" 


}, 
{ 
    "_id" : "12312342332423343", 
    "name" : "Total_pop", 
    "description" : "sales category", 
    "source" : "private", 
    "description" : "d1" 
} 

Muszę kolekcję odrębną od zestawu danych, gdzie źródło jest publiczna. Próbowałem tej kwerendy, i to nie działa:

Criteria criteria = new Criteria(); 
criteria.where("source").in("public");  
query.addCriteria(criteria); 
query.fields().include("name"); 
query.fields().include("description"); 
query.fields().include("description"); 
query.fields().include("source"); List list = 
mongoTemplate.getCollection("collectionname").distinct("source", query); 

Czy możesz mi pomóc?

+0

"; Lista lista ="? –

Odpowiedz

9

Po pierwsze metoda .getCollection() zwraca podstawowy przedmiot kolekcja kierowcy tak:

DBCollection collection = mongoTemplate.getCollection("collectionName"); 

Więc typ obiektu zapytania może być różny od tego, co używasz, ale jest też kilka innych rzeczy. Mianowicie, że .distinct() zwraca tylko wartości "distint" żądanego klucza i nie zwraca innych pól dokumentu. Więc możesz zrobić:

Criteria criteria = new Criteria(); 
criteria.where("dataset").is("d1"); 
Query query = new Query(); 
query.addCriteria(criteria); 
List list = mongoTemplate.getCollection("collectionName") 
    .distinct("source",query.getQueryObject()); 

Ale to tylko zwróci "próbkę" jako pojedynczy element na liście, na przykład.

Jeśli chcesz "pola" z odrębnego zestawu, użyj zamiast tego metody .aggregate(). Albo z „pierwszej” wystąpień pozostałych wartości pól za wyraźną kluczowe:

DBCollection colllection = mongoTemplate.getCollection("collectionName"); 

    List<DBObject> pipeline = Arrays.<DBObject>asList(
     new BasicDBObject("$match",new BasicDBObject("dataset","d1")), 
     new BasicDBObject("$group", 
      new BasicDBObject("_id","$source") 
       .append("name",new BasicDBObject("$first","$name")) 
       .append("description", new BasicDBObject("$first","$description")) 
     ) 
    ); 

    AggregationOutput output = colllection.aggregate(pipeline); 

lub rzeczywisty „różnych” wartości wielu dziedzinach, czyniąc je częścią ugrupowania kluczowe:

DBCollection colllection = mongoTemplate.getCollection("collectionName"); 

    List<DBObject> pipeline = Arrays.<DBObject>asList(
     new BasicDBObject("$match",new BasicDBObject("dataset","d1")), 
     new BasicDBObject("$group", 
      new BasicDBObject("_id", 
       new BasicDBObject("source","$source") 
        .append("name","$name") 
        .append("description","$description") 
      ) 
     ) 
    ); 

    AggregationOutput output = colllection.aggregate(pipeline); 

Istnieje również metoda bezpośrednia .aggregate() na instancjach mongoTemplate, która ma wiele metod pomocniczych do budowania potoków. Ale to powinno wskazać ci przynajmniej właściwy kierunek.