2016-08-09 2 views
0

У меня есть коллекция в MongoDb со следующимиКак получить различные значения CONCAT 2 столбцов в MongoDB Spring

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

Мне нужно, чтобы получить следующие результаты как

1992-A 
1992-B 

Мне нужно найти отчетливые каскадных колонн (год и начальные), где имя = «тест»

до сих пор я пытался как

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 

общественного класса MyNames реализует 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 + "]"; 
} 
} 

Это не работает .. Любая помощь приветствуется ..

+0

Не могли бы вы добавить объявление класса MyNames на вопрос? –

+0

@AndriySimonov: Я добавил объявление класса MyNames –

ответ

1

Вот код. Пожалуйста, измените название коллекции соответствующим образом.

Включен дефис между годом и начальным.

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; 

    } 

Выход: -

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} 

Совокупные API не дает вам список. Однако вы можете получить список идентификаторов, итерации данных.

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

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

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

Спасибо .. как я получу вывод как List? –

+0

Обновлен ответ, чтобы получить список идентификаторов. Он должен дать вам «[1992-A, 1992-B]». – notionquest

+0

Спасибо @notionquest. для сохранения моего времени. –

Смежные вопросы