Bijwerken:
Vanaf v2.0 van Spring Data kun je dit doen:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Oorspronkelijke antwoord:
Abstractielagen zoals spring-mongo zullen altijd ver achterblijven bij door de server vrijgegeven functies. De BSON-documentstructuur voor de pijplijnfase kunt u dus het beste zelf samenstellen.
Implementeren in een aangepaste 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);
}
}
En gebruik dan in je code:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Aangezien dit AggregationOperation
implementeert dit werkt goed met de bestaande hulpmethoden voor pijplijnbewerkingen. dat wil zeggen:
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")))
)
);
Dus nogmaals, alles is uiteindelijk slechts een BSON-object. Het is gewoon een kwestie van een interface-wrapper hebben, zodat de klassenmethoden in spring-mongo het resultaat interpreteren en uw gedefinieerde BSON-object correct krijgen.