转载务必说明出处:https://blog.csdn.net/LiaoHongHB/article/details/83579030
spring boot整合mongdb,其中的mongodbTemplate只有一些简单的方法对mongodb数据进行基本的增删改查,对于一些复杂的查询条件通过Aggregation聚合函数来操作。
1、导入jar包
org.springframework.boot
spring-boot-starter-data-mongodb
2、创建MongoDao接口和该接口实现类
public class MongoDaoImpl implements MongoDao {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(MongoDaoImpl.class);
@Autowired
protected MongoTemplate mongoTemplate;
/**
* clazz
*/
private Class clazz;
public MongoDaoImpl() {
try {
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class) type.getActualTypeArguments()[0];
LOGGER.info("reflect Class:{}", clazz);
} catch (Exception e) {
LOGGER.error("MongoDaoImpl reflection happen error:{}", e);
}
}
3、聚合方法实例
/**
* 分组查询
*
* @param pageNum 页数
* @param pageSize 每页记录数
* @param criteria1 查询条件1
* @param criteria2 查询条件2
* @param field1 分组属性1
* @param field2 分组属性2
* @param sort 排序
* @param collectionName mongdb表的名字
* @return
* @throws BbsException
*/
@Override
public AggregationResults aggregation(int pageNum, int pageSize, Criteria criteria1, Criteria criteria2,String field1, String field2, String sortName, Sort sort, String collectionName) throws BbsException {
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(criteria1),
Aggregation.match(criteria2),
Aggregation.group(field1, field2).last(sortName).as(sortName),
Aggregation.sort(sort),
Aggregation.skip((pageNum - 1) * pageSize),
Aggregation.limit(pageSize)
);
return mongoTemplate.aggregate(aggregation, collectionName, clazz);
}
需求示例:查找用户评论的帖子并且该帖子没有被删除;并且按照时间倒序进行分页显示;
Aggregation.match(criteria1):指的是查询条件,这里可以有两个查询条件(用户的id和帖子的状态) Aggregation.group(field1, field2).last(sortName).as(sortName):group是指根据表中的若干个属性进行分组查询 (这里根据两个属性,一个是帖子id,另一个是帖子类型);last是指保留最后一条评论的记录(也就是对某个帖子有 多条评论的话保留最新一条评论记录);as是指将表中的某个属性映射到一个别名,由于这里要根据评论的时间排 序,所以这里的属性为评论时间属性字段;
Aggregation.sort是指根据排序条件进行排序,这里根据评论时间进行排序;
Aggregation.skip和Aggregation.limit则是分页的操作;
说明:在上述示例中,只根据了两个属性进行group,那么返回的结果集合也只有这两个属性有值,该表中其他的字段为null
如果要根据某字段排序,则要在last中添加该属性即可 。
去重:mongodb中的去重方法是Aggregation.distinct(去重字段),不过该方法只能对一个字段去重,多个字段去重就参照上面 的group方法,去重之后的结果集合也只有去重字段有值,其他字段为null。