Pembaruan:
Dimulai dengan Spring Data v2.0, Anda dapat melakukan ini:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Jawaban asli:
Lapisan abstraksi seperti spring-mongo selalu tertinggal jauh di belakang fitur yang dirilis server. Jadi, sebaiknya Anda membuat sendiri struktur dokumen BSON untuk tahap pipeline.
Terapkan di kelas khusus:
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);
}
}
Dan kemudian gunakan dalam kode Anda:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Karena ini mengimplementasikan AggregationOperation
ini bekerja dengan baik dengan metode pembantu operasi pipa yang ada. yaitu:
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")))
)
);
Jadi sekali lagi, semuanya hanyalah Objek BSON pada akhirnya. Ini hanya masalah memiliki pembungkus antarmuka sehingga metode kelas di spring-mongo menafsirkan hasilnya dan mendapatkan Objek BSON yang Anda tetapkan dengan benar.