来自MongoDB的随机文档使用spring-data

我可以通过使用这个mongodb本机查询来做到这一点:

db.books.aggregate( [ { $sample: { size: 15 } } ] ) 

但是如何在spring-data-mongodb做到这一点?

我在Spring Aggregation Framework的 Aggregation类中找不到类似的操作

更新:

从Spring Data v2.0开始,您可以这样做:

 SampleOperation matchStage = Aggregation.sample(5); Aggregation aggregation = Aggregation.newAggregation(sampleStage); AggregationResults output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class); 

原始答案:

像spring-mongo这样的抽象层总是落后于服务器发布的function。 因此,您最好自己为管道阶段构建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( // 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"))) ) ); 

所以,在一天结束时,一切都只是一个BSON对象。 这只是一个接口包装器的问题,以便spring-mongo中的类方法解释结果并正确获取定义的BSON对象。

Blakes Seven正确回答了它,然而,我想提供一个更好的AggregationOperation实现,它遵循标准的Spring实现

 import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.springframework.data.mongodb.core.aggregation.AggregationOperation; import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.util.Assert; public class SampleOperation implements AggregationOperation { private int size; public SampleOperation(int size) { Assert.isTrue(size > 0, " Size must be positive!"); this.size = size; } public AggregationOperation setSize(int size) { Assert.isTrue(size > 0, " Size must be positive!"); this.size = size; return this; } @Override public DBObject toDBObject(AggregationOperationContext context) { return new BasicDBObject("$sample", context.getMappedObject(Criteria.where("size").is(size).getCriteriaObject())); } } 

之后,您可以使用构造函数创建SampleOperation对象,或者稍后通过setSize()方法更改它的大小,并将其应用于aggregate()函数。

更新:在SpringBoot 2.0.0+和Spring Framework 5.0中:Spring Mongo删除DBObject并替换为org.bson.Document因此最后的过去应该更新为:

  @Override public Document toDocument(AggregationOperationContext aggregationOperationContext) { return new Document("$sample", aggregationOperationContext.getMappedObject(Criteria.where("size").is(size).getCriteriaObject())); 

}

并删除@Override toDBObject