更新:
从Spring Data v2.0开始,您可以这样做:
SampleOperation matchStage = Aggregation.sample(5)
Aggregation aggregation = Aggregation.newAggregation(sampleStage)
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class)
“
”该段落是HTML中的一个水平线标签,没有具体的翻译含义。该回答讨论了使用spring-mongo等抽象层时可能会滞后于服务器发布的功能,因此最好自己构建BSON文档结构来实现流水线阶段。同时建议通过自定义类来实现此功能。
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);
}
}
然后在你的代码中使用:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
)
);
由于这个实现了
AggregationOperation
,因此它可以很好地与现有的管道操作辅助方法配合使用。例如:
Aggregation aggregation = newAggregation(
new CutomAggregationOperation(
new BasicDBObject(
"$sample",
new BasicDBObject( "size", 15 )
)
),
match(
Criteria.where("myDate")
.gte(new Date(new Long("949384052490")))
.lte(new Date(new Long("1448257684431")))
)
);
所以说,最终一切都只是 BSON 对象。只需要一个接口包装器,让 spring-mongo 中的类方法解释结果并正确获取定义的 BSON 对象即可。