Актуализация:
Започвайки с v2.0 на Spring Data можете да направите това:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Оригинален отговор:
Слоевете на абстракция като spring-mongo винаги ще изостават много от пуснатите от сървъра функции. Така че е най-добре сами да конструирате структурата на документа BSON за етапа на конвейера.
Внедрете в персонализиран клас:
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);
}
}
И след това използвайте във вашия код:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Тъй като това имплементира AggregationOperation
това работи добре със съществуващите помощни методи за работа на тръбопровода. т.е.:
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")))
)
);
Така че отново всичко е просто BSON обект в края на деня. Въпросът е само да имате обвивка на интерфейса, така че методите на класа в spring-mongo да интерпретират резултата и да получат вашия дефиниран BSON обект правилно.