Aggiornamento:
A partire dalla v2.0 di Spring Data puoi farlo:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Risposta originale:
I livelli di astrazione come spring-mongo sono sempre in ritardo rispetto alle funzionalità rilasciate dal server. Quindi è meglio costruire tu stesso la struttura del documento BSON per la fase della pipeline.
Implementa in una classe personalizzata:
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);
}
}
E poi usa nel tuo codice:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Poiché questo implementa AggregationOperation
questo funziona bene con i metodi di supporto delle operazioni della pipeline esistenti. cioè:
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")))
)
);
Quindi, di nuovo, tutto è solo un oggetto BSON alla fine della giornata. Si tratta solo di avere un wrapper di interfaccia in modo che i metodi di classe in spring-mongo interpretino il risultato e ottengano correttamente l'oggetto BSON definito.