Aktualisierung:
Ab Version 2.0 von Spring Data können Sie Folgendes tun:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Ursprüngliche Antwort:
Abstraktionsschichten wie Spring-Mongo werden immer weit hinter den vom Server veröffentlichten Funktionen zurückbleiben. Die BSON-Dokumentenstruktur für die Pipeline-Phase bauen Sie also am besten selbst auf.
Implementieren Sie in einer benutzerdefinierten 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);
}
}
Und verwenden Sie dann in Ihrem Code:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Da dies AggregationOperation
implementiert Dies funktioniert gut mit den vorhandenen Hilfsmethoden für Pipelineoperationen. d.h.:
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")))
)
);
Also nochmal, am Ende des Tages ist alles nur ein BSON-Objekt. Es geht nur darum, einen Interface-Wrapper zu haben, damit die Klassenmethoden in Spring-Mongo das Ergebnis interpretieren und Ihr definiertes BSON-Objekt korrekt erhalten.