2016-04-26 10 views
2

Ich schreibe eine dynamische MongoDB-Abfrage mit Aggregation und Criteria wie so.Spring MongoDB: Kriterien Methoden nicht statischen Zugriff

Aggregation aggregation; 
AggregationResults<DataContentResult> result; 
List<DataContentResult> theResult; 
try { 
    aggregation = Aggregation.newAggregation(
       buildMatchCriteriaForAggregation(publisherId, filter) 
       , buildGroupOperationForAggregation()); 

    result = mongoTemplate.aggregate(aggregation, DataContent.class, DataContentResult.class); 
    theResult = result.getMappedResults(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

@SuppressWarnings("static-access") 
private AggregationOperation buildMatchCriteriaForAggregation(Integer publisherId, Filter filterCriteria){ 
    Criteria criteria = new Criteria(); 
    criteria.where("publisherId").is(publisherId); 

    if (filterCriteria.getTa() != null) criteria.where("type").is(filterCriteria.getTa()); 
    if (filterCriteria.getPlz() != null) criteria.where("zip").is(ilterCriteria.getPlz()); 
    if (filterCriteria.getTbVerlag() != null) criteria.where("tbVerlagNr").is(filterCriteria.getTbVerlag()); 

    return Aggregation.match(criteria); 
} 

Jetzt weiß ich, dass soll ich Criteria Methoden in einer statischen Art und Weise wie Criteria.where("something").is("something") zuzugreifen. Aber in meinem Fall muss ich mein Filter Kriterium abhängig von ihrer Verfügbarkeit spezifizieren. Und deshalb muss ich es wie oben tun. Dies funktioniert nicht und das criteria Objekt endet jedes Mal aus irgendeinem Grund leer.

Welche alternative Methode wird in dieser Situation empfohlen? Oder mache ich etwas falsch?

Antwort

2

Ordnung so wandte sich die Antwort aus ganz einfach zu sein, wie folgt:

Criteria criteria = new Criteria(); 

criteria = criteria.where("publisherId").is(publisherId); 
if(<condition>) criteria = criteria.orOperator(
         Criteria.where("something").is("something")); 
Verwandte Themen