Cập nhật:
Bắt đầu với v2.0 của Spring Data, bạn có thể thực hiện việc này:
SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);
Câu trả lời ban đầu:
Các lớp trừu tượng như spring-mongo luôn bị tụt hậu so với các tính năng do máy chủ phát hành. Vì vậy, tốt nhất bạn nên tự mình xây dựng cấu trúc tài liệu BSON cho giai đoạn đường ống.
Triển khai trong một lớp tùy chỉnh:
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);
}
}
Và sau đó sử dụng trong mã của bạn:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
Vì điều này thực hiện AggregationOperation
điều này hoạt động tốt với các phương pháp trợ giúp vận hành đường ống hiện có. tức là:
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")))
)
);
Vì vậy, một lần nữa, mọi thứ chỉ là một Đối tượng BSON vào cuối ngày. Vấn đề chỉ là có một trình bao bọc giao diện để các phương thức lớp trong spring-mongo diễn giải kết quả và nhận đối tượng BSON đã xác định của bạn một cách chính xác.