2015-07-26 2 views
8

Mein MongoDB json Strukturmongodb mongoTemplate erhält eigenes Feld mit einigen Kriterien

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

ich brauche, ist Sammlung verschieden von Daten-Set zu bekommen, wo Quelle öffentlich ist. Ich habe versucht, diese Abfrage, und es hat nicht funktioniert:

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

Können Sie mir bitte helfen?

+0

"; Liste list ="? –

Antwort

9

Zum einen die .getCollection() Methode liefert die grundlegende Treiber Sammelobjekt wie folgt:

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

So ist die Art der Abfrage Objekt kann unterschiedlich sein von dem, was Sie verwenden, aber es gibt auch einige andere Dinge. Nämlich, dass nur die "distint" -Werte des gesuchten Schlüssels zurückgibt und andere Felder des Dokuments nicht zurückgibt. So könnten Sie tun:

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

Aber das wird nur "Probe" als einzelnes Element in der Liste zum Beispiel zurückgeben.

Wenn Sie die "Felder" aus einem bestimmten Satz möchten, verwenden Sie stattdessen die Methode .aggregate(). Entweder mit den „ersten“ Vorkommen der anderen Feldwerte für den deutlichen Schlüssel:

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

oder die tatsächlichen „distinct“ Werte aus mehreren Feldern, durch sie alle Teil des Gruppierungsschlüssels machen:

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

Es gibt auch eine direkte .aggregate()-Methode auf mongoTemplate-Instanzen, die eine Reihe von Hilfsmethoden zum Erstellen von Pipelines enthält. Aber das sollte Sie zumindest in die richtige Richtung weisen.

Verwandte Themen