Uppdatering:
Från och med v2.0 av Spring Data kan du göra detta:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Ursprungligt svar:
Abstraktionslager som spring-mongo kommer alltid att släpa långt efter serverutgivna funktioner. Så det är bäst att du bygger BSON-dokumentstrukturen för pipelinestadiet själv.
Implementera i en anpassad klass:
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);
}
}
Och använd sedan i din kod:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Eftersom detta implementerar AggregationOperation
detta fungerar bra med de befintliga hjälpmetoderna för 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å återigen, allt är bara ett BSON-objekt i slutet av dagen. Det gäller bara att ha ett gränssnitts-omslag så att klassmetoderna i spring-mongo tolkar resultatet och får ditt definierade BSON-objekt korrekt.