Opdatering:
Fra v2.0 af Spring Data kan du gøre dette:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Oprindeligt svar:
Abstraktionslag som spring-mongo vil altid halte langt bagefter serverfrigivne funktioner. Så det er bedst for dig selv at konstruere BSON-dokumentstrukturen til pipelinestadiet.
Implementer i en tilpasset klasse:
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);
}
}
Og brug derefter i din kode:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Da dette implementerer AggregationOperation
dette fungerer godt med de eksisterende hjælpemetoder til pipelinedrift. dvs.:
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")))
)
);
Så igen er alt bare et BSON-objekt i slutningen af dagen. Det er bare et spørgsmål om at have en interface wrapper, så klassemetoderne i spring-mongo fortolker resultatet og får dit definerede BSON-objekt korrekt.