2016-08-09 44 views
0

Ich habe eine Sammlung in MongoDB mit folgendenWie verschiedene Werte von Concat von 2 Spalten in MongoDB Frühling bekommen

{ 
"_id" : ObjectId("5756b0rrffac18767"), 
"year" : "1992", 
"initial" : "A", 
    "name" : "test" 

} 

/* 2 */ 
{ 
    "_id" : ObjectId("5756b0ffac18767"), 
"year" : "1992", 
"initial" : "B", 
    "name" : "test" 
} 

/* 3 */ 
{ 
"_id" : ObjectId("5756b0ffwwac18767"), 
"year" : "1993", 
"initial" : "A", 
    "name" : "test1" 
} 

/* 4 */ 
{ 
"_id" : ObjectId("5756b0ffacee767"), 
"year" : "1992", 
"initial" : "A", 
    "name" : "test" 
} 

ich folgende Ergebnisse wie

1992-A 
1992-B 

bekommen muss ich finden müssen die deutliche von verketteten Spalten (Jahr und initial), wo name = "test"

Bisher habe wie

versucht
public List<MyNames> getYears(String name) { 
    TypedAggregation<MyNames> agg = Aggregation.newAggregation(MyNames.class, 
      project("id","year", "initial"), 
      match(Criteria.where("name").is(name)) 
      group("year") 

     ); 

     AggregationResults<MyNames> result = mongoTemplate.aggregate(agg, MyNames.class); 
     List<MyNames> resultList = result.getMappedResults(); 
    return resultList; 
    } 

Mynames

@Document 

public class Mynames implementiert Serializable {

private static final long serialVersionUID = -5763434erertr33331L; 

@Id 
private String id; 
private int year; 
private String name; 
private String initial; 

public String getId() { 
    return id; 
} 
public void setId(String id) { 
    this.id = id; 
} 
public int getYear() { 
    return year; 
} 
public void setYear(int year) { 
    this.year = year; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public String getInitial() { 
    return initial; 
} 
public void setInitial(String initial) { 
    this.initial = initial; 
} 

@Override 
public String toString() { 
    return "MyNames [id=" + id + ", year=" + year + ", name=" + name + ", initial=" + initial + "]"; 
} 
} 

Dies funktioniert nicht .. Jede Hilfe ist willkommen ..

+0

Könnten Sie die MyNames-Klassendeklaration zur Frage hinzufügen? –

+0

@AndriySimonov: Ich habe die MyNames-Klasse Erklärung hinzugefügt –

Antwort

1

Hier ist der Code ist. Bitte ändern Sie den Sammlungsnamen entsprechend.

Enthalten den Bindestrich zwischen Jahr und Initial.

public Boolean aggregateYearCollection(String name) { 

     MongoOperations mongoOperations = getMongoConnection(); 

     MatchOperation match = new MatchOperation(Criteria.where("name").is(name)); 
     ProjectionOperation project = Aggregation.project("year", "initial").andExpression("concat(year, '-', initial)").as("yearAndInitial"); 
     Aggregation aggregate = Aggregation.newAggregation(match, project, Aggregation.group("yearAndInitial")); 

     System.out.println(aggregate.toString()); 

     AggregationResults<YearCollection> yearCollectionAggregate = mongoOperations.aggregate(aggregate, "yearcoll", YearCollection.class); 

     if (yearCollectionAggregate!=null) { 
      System.out.println("Output ====>" + yearCollectionAggregate.getRawResults().get("result")); 
      System.out.println("Output ====>" + yearCollectionAggregate.getRawResults().toMap()); 
     } 

     return true; 

    } 

Ausgang: -

Output ====>[ { "_id" : "1992-A"} , { "_id" : "1992-B"}] 
Output ====>{serverUsed=127.0.0.1:27017, waitedMS=0, result=[ { "_id" : "1992-A"} , { "_id" : "1992-B"}], ok=1.0} 

Aggregate API nicht Sie die Liste geben. Sie können jedoch die Liste der IDs abrufen, indem Sie die Daten durchlaufen.

Iterator<YearCollection> yearCollectionIterator = yearCollectionAggregate.iterator(); 

List<String> valueList = new ArrayList<String>(); 

while(yearCollectionIterator.hasNext()) { 
    valueList.add(yearCollectionIterator.next().getId()); 
} 
+0

Danke..wie bekomme ich die Ausgabe als Liste? –

+0

Die Antwort aktualisiert, um die Liste der IDs zu erhalten. Es sollte Ihnen "[1992-A, 1992-B]" geben. – notionquest

+0

Dank @notionquest. um meine Zeit zu sparen. –