Aktualizacja:
Począwszy od wersji 2.0 Spring Data możesz to zrobić:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Oryginalna odpowiedź:
Warstwy abstrakcji, takie jak wiosna-mongo, zawsze pozostają w tyle za funkcjami udostępnianymi przez serwer. Najlepiej więc samodzielnie skonstruować strukturę dokumentu BSON dla etapu potoku.
Zaimplementuj w niestandardowej klasie:
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);
}
}
A następnie użyj w swoim kodzie:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Ponieważ implementuje to AggregationOperation
działa to dobrze z istniejącymi metodami pomocniczymi operacji potoku. tj.:
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")))
)
);
Więc znowu, wszystko jest po prostu obiektem BSON na koniec dnia. To tylko kwestia posiadania wrappera interfejsu, dzięki któremu metody klasy w spring-mongo zinterpretują wynik i poprawnie uzyskają zdefiniowany obiekt BSON.