Mise à jour :
À partir de la v2.0 de Spring Data, vous pouvez faire ceci :
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Réponse originale :
Les couches d'abstraction comme spring-mongo seront toujours à la traîne par rapport aux fonctionnalités publiées par le serveur. Il est donc préférable de construire vous-même la structure du document BSON pour l'étape du pipeline.
Implémenter dans une classe personnalisée :
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);
}
}
Et puis utilisez dans votre code :
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Puisque cela implémente AggregationOperation
cela fonctionne bien avec les méthodes d'assistance d'opération de pipeline existantes. c'est-à-dire :
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")))
)
);
Encore une fois, tout n'est qu'un objet BSON à la fin de la journée. Il s'agit simplement d'avoir un wrapper d'interface pour que les méthodes de classe de spring-mongo interprètent le résultat et obtiennent correctement votre objet BSON défini.