接了一个需求,要随机从MongoDB中选取一定数量的数据出来。
如果是sql的话,主键是自增的Int,可以先随机生成一个数,然后去找主键等于这个随机数的数据,就能实现随机查询。但是mongo中主键是自动生成的一串字符,没法根据主键查找。同时,把所有数据全部查出来,在list中再随机查找,如果数据量不大还行,数据量大这样太费时间了。
后来上网查询发现mongo中有聚合函数可以直接实现,在控制台的命令如下
随机查询10条数据
db.user.aggregate( [ { $sample: { size: 10 } } ] )
在spring则写法如下:
protected List<T> getRandom(Long size, Class<T> cls){
Aggregation aggregation =
Aggregation.newAggregation(
Aggregation.match(Criteria.where("status").is(1)),
Aggregation.sample(size));
AggregationResults<T> outputTypeCount =
mongoTemplate.aggregate(aggregation, cls, cls);
return outputTypeCount.getMappedResults();
}
match里写的是自己需要匹配的查询语句。
spring中如何写查询语句,怎么和控制台的语句对应起来一直是个大问题。。。自己只能慢慢摸索。还是sql写起来舒服。。。