在上次的 基于java程序的mongodb随机查询的一个解决方案(一) 之后,又发现一种方法,在此记录
mongoTemplate Aggregation
使用聚合查询提供的抽样方法来做随机查询,没有做性能测试。速度应该可以
package com.mongo.demo.aggregation;
import com.mongo.demo.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author Tan
* @version V1.0
* @description: Sample 使用聚合操作随机查询
* @date 2019/10/23
*/
@Service
public class Sample {
@Autowired
private MongoTemplate mongoTemplate;
public List<Person> findPerson() {
List<Person> personList = new ArrayList<>();
// 构造随机条件,sample是聚合操作提供的随机抽样方法,此处抽样2个
// 有两种方式 对应两个构造方法
// 1、public static <T> TypedAggregation<T> newAggregation(Class<T> type, AggregationOperation... operations)
Aggregation agg = Aggregation.newAggregation(Person.class, Aggregation.sample(2));
AggregationResults<Person> peoples = mongoTemplate.aggregate(agg, Person.class, Person.class);
peoples.forEach((person)->{
System.out.println(peoples);
personList.add(person);
});
//2、public static <T> TypedAggregation<T> newAggregation(Class<T> type, List<? extends AggregationOperation> operations)
TypedAggregation<Person> aggu = Aggregation.newAggregation(Person.class, Aggregation.sample(2));
AggregationResults<Person> aggregate = mongoTemplate.aggregate(aggu, Person.class);
aggregate.forEach((aggr)->{
System.out.println(aggr);
personList.add(aggr);
});
return personList;
}
public void savePerson() {
mongoTemplate.save(new Person("zhan1", "男", 23));
mongoTemplate.save(new Person("zhan2", "男", 25));
mongoTemplate.save(new Person("zhan3", "男", 18));
mongoTemplate.save(new Person("zhan4", "男", 29));
mongoTemplate.save(new Person("zhan5", "男", 56));
}
}