Aktualizace:
Počínaje verzí 2.0 Spring Data můžete provést toto:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Původní odpověď:
Abstrakce vrstvy jako spring-mongo budou vždy zaostávat za funkcemi vydanými na serveru. Strukturu dokumentu BSON pro fázi pipeline si tedy nejlépe vytvoříte sami.
Implementujte ve vlastní třídě:
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 pak ve svém kódu použijte:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Protože to implementuje AggregationOperation
to funguje dobře se stávajícími pomocnými metodami provozu potrubí. 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")))
)
);
Takže znovu, všechno je na konci dne jen objekt BSON. Jde jen o to mít obal rozhraní, aby metody třídy v spring-mongo interpretovaly výsledek a správně získaly vámi definovaný objekt BSON.