2015-07-26 15 views
8

mio MongoDB struttura JSON èMongoDB mongoTemplate ottenere campo distinto con alcuni criteri

{ 
    "_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" 
} 

ho bisogno di ottenere la raccolta netta di set di dati in cui sorgente è pubblico. Ho provato questa query, e non ha funzionato:

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); 

Potete per favore darmi una mano?

+0

"; Lista lista ="? –

risposta

9

Per prima cosa il metodo .getCollection() restituisce l'oggetto di raccolta driver di base in questo modo:

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

Così il tipo di oggetto di query potrebbe essere diverso da quello che si sta utilizzando, ma ci sono anche alcune altre cose. Vale a dire che .distinct() restituisce solo i valori "distintivo" della chiave richiesta e non restituisce altri campi del documento. Quindi potresti fare:

Ma questo è solo per restituire "esempio" come un singolo elemento nella lista, per esempio.

Se si desidera "campi" da un set distinto, utilizzare invece il metodo .aggregate(). Sia con le occorrenze "primi" degli altri valori di campo per la chiave distinte:

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); 

Oppure i valori effettivi "distinti" di più campi, facendoli tutti parte della chiave di raggruppamento:

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); 

Ci sono anche un metodo diretto .aggregate() su istanze di mongoTemplate, che ha un numero di metodi di supporto per costruire pipeline. Ma questo dovrebbe indirizzarti nella giusta direzione almeno.

Problemi correlati