基于java程序的mongodb随机查询的一个解决方案(一)

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

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;
}

后续:基于java程序的mongodb随机查询的一个解决方案(二)_亲测,只为展现最完美的有效!-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cy谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值