Actualización:
A partir de la versión 2.0 de Spring Data, puede hacer esto:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Respuesta original:
Las capas de abstracción como spring-mongo siempre van a quedar muy rezagadas con respecto a las funciones lanzadas por el servidor. Por lo tanto, es mejor que construya usted mismo la estructura del documento BSON para la etapa de canalización.
Implementar en una clase personalizada:
public class CustomAggregationOperation implements AggregationOperation {
private DBObject operation;
public CustomAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
Y luego usa en tu código:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Dado que esto implementa AggregationOperation
esto funciona bien con los métodos auxiliares de operación de tubería existentes. es decir:
Aggregation aggregation = newAggregation(
// custom pipeline stage
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
),
// Standard match pipeline stage
match(
Criteria.where("myDate")
.gte(new Date(new Long("949384052490")))
.lte(new Date(new Long("1448257684431")))
)
);
Entonces, nuevamente, todo es solo un Objeto BSON al final del día. Es solo una cuestión de tener un contenedor de interfaz para que los métodos de clase en spring-mongo interpreten el resultado y obtengan su objeto BSON definido correctamente.