Cómo usar la operación $ cond en el marco de agregación Spring-MongoDb

Tengo una canalización de agregación que incluye un proyecto como este:

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

que funciona bien en mongo shell. ¿Cómo express esto usando el marco de Agregación en Spring-Mongodb? He visto los tipos ProjectionOperationBuilder, ExpressionProjectionOperationBuilder pero no un ejemplo de cómo usarlos … ¿alguna sugerencia?

Si utiliza la versión actual de Spring Data que tiene soporte para el operador $cond través de la canalización de $project , esto se puede convertir a (no probado):

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

Para la versión de Spring-Data MongoDB que no tiene soporte para el operador $cond en la operación de agregación, existe una solución que consiste en implementar la interfaz AggregationOperation para incorporar 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); } } 

Luego, implemente la operación $project como DBObject en la canalización de agregación que sea la misma que la que tiene:

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

que luego puedes usar en TypeAggregation:

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

Agregué el mismo problema y busqué en Google, y este fue el primer resultado que encontré, así que me gustaría añadir para futuros lectores que esta característica ya está disponible desde la versión 1.10 RC1 con la clase ConditionalOperators.Cond .

Puedes leer el JavaDoc aquí .