MongoDB 的随机查询 mongoTemplate 没有提供相关方法,只能自己写相应算法
对于返回一个值得方法:
产生一个随机数,用分页的方式查询
1、查询数据总量 count
2、在这个总量上生成一个随机数 startNum = (new Random().nextInt(count.intValue())
3、分页查询该值Query().skip(startNum).limit(1)
如果是查询多个随机值,使用下面这个方法
从上面算法继续思考,我们可以指定一个分组量groupNum
使查询条件变成 Query().skip(startNum).limit(groupNum)
groupNum越小,随机性就越强,然后经过多次查询得到我们要的随机数量的查询
举个例子:
我们需要在数据表person中随机查询1000个值
第一步:查询person总量等于 100000
第二步:设定groupNum等于10
第二步:执行100次循环,每次循环 执行
{
在10000产生一个随机数 startNum
persons = 查询条件Query().skip(startNum).limit(groupNum)查出的数据
}
这个我们就能在100000个数据里面获得1000个随机数了,前面说到groupNum越小,随机性越强,但是同时也增加查询次数
当然这个方案上需要考虑重复数据的剔除,以及skip的越界问题
一个demo
/**
* 随机获取
* 分组随机,可配置,组越小,随机性越强
* @return
*/
private List<Person> getPersons() {
// 获取总数
Long count = mongoTemplate.count(new Query(), Person.class);
int i = 0; // 控制循环次数
// 产生随机数
List<Person> Personlist = new ArrayList<>();
List<String> idlist = new ArrayList<>();
while (Personlist.size() < queryCount && i < queryCount/groupNum*2 ) {
Long startNum = Long.valueOf(new Random().nextInt(count.intValue()));
if(startNum > count - groupNum){
startNum = count - groupNum;
}
//skip相当于从那条记录开始, 从skip开始,取多少条记录
Query query = new Query().skip(startNum).limit(groupNum);
List<Person> list = mongoTemplate.find(query, Person.class);
final Iterator<Person> iterator = list.iterator();
while (iterator.hasNext()) {
final Person Person = iterator.next();
if (idlist.contains(Person.getId())) {
iterator.remove();
}else{
idlist.add(Person.getId());
}
}
Personlist.addAll(list);
i ++ ;
}
return Personlist;
}

本文介绍了如何在MongoDB中利用MongoTemplate实现分组随机查询,通过设置groupNum控制随机性和查询效率,详细讲解了如何获取1000个随机数据实例,并处理重复和边界问题。
554

被折叠的 条评论
为什么被折叠?



