Come utilizzare l’operazione $ cond nel framework di aggregazione Spring-MongoDb

Ho una pipeline di aggregazione che include un progetto come questo:

$project: { start: { $cond: { if: { $eq: ["$start", "EARLY"] }, then: "$deltastart.start", else: "$deltastart.end" } },... },... 

che funziona bene nella shell mongo. Come esprimerlo usando il framework Aggregation in Spring-Mongodb? Ho visto ProjectionOperationBuilder, ExpressionProjectionOperationBuilder ma non un esempio su come usarli … qualche suggerimento?

Se si utilizza l’attuale versione Spring Data che supporta l’operatore $cond tramite la pipeline $project , è ansible convertirla in (non testata):

 import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.*; import org.springframework.data.mongodb.core.query.Criteria; Cond condOperation = ConditionalOperators.when(Criteria.where("start").is("EARLY")) .thenValueOf("deltastart.start") .otherwise("deltastart.end"); Aggregation agg = newAggregation(project().and(condOperation).as("start")); AggregationResults results = mongoTemplate.aggregate(agg, MyClass.class); List myList = results.getMappedResults(); 

Per la versione di Spring-Data MongoDB che non ha il supporto per l’operatore $cond nell’operazione di aggregazione, esiste una soluzione alternativa che consiste nell’implementare l’interfaccia AggregationOperation per includere un DBObject:

 public class CustomProjectAggregationOperation implements AggregationOperation { private DBObject operation; public CustomProjectAggregationOperation (DBObject operation) { this.operation = operation; } @Override public DBObject toDBObject(AggregationOperationContext context) { return context.getMappedObject(operation); } } 

Quindi implementa l’operazione $project come DBObject nella pipeline di aggregazione che è la stessa di quella che hai:

 DBObject operation = (DBObject) new BasicDBObject( "$project", new BasicDBObject( "start", new BasicDBObject( "$cond", new Object[]{ new BasicDBObject( "$eq", new Object[]{ "$start", "EARLY"} ), "$deltastart.start", "$deltastart.end" } ) ) ); 

che puoi utilizzare in TypeAggregation:

 TypedAggregation aggregation = newAggregation(CustomClass.class, new CustomProjectAggregationOperation(operation) ); AggregationResults result = mongoTemplate.aggregate(aggregation, CustomClass.class); 

Ho aggiunto lo stesso problema e ho cercato su Google e questo è stato il primo risultato che ho trovato, quindi vorrei aggiungere per i futuri lettori che questa funzione è ora disponibile dalla versione 1.10 RC1 con la class ConditionalOperators.Cond .

Puoi leggere JavaDoc qui .