MongoDB聚合操作实例(基于SpringBoot 整合MongoDB)

转载务必说明出处:https://blog.csdn.net/LiaoHongHB/article/details/83579030

       spring boot整合mongdb,其中的mongodbTemplate只有一些简单的方法对mongodb数据进行基本的增删改查,对于一些复杂的查询条件通过Aggregation聚合函数来操作。

1、导入jar包

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>

2、创建MongoDao接口和该接口实现类

public class MongoDaoImpl<T> implements MongoDao<T> {

    /**
     * 日志
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(MongoDaoImpl.class);

    @Autowired
    protected MongoTemplate mongoTemplate;

    /**
     * clazz
     */
    private Class<T> clazz;

    public MongoDaoImpl() {
        try {
            ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
            clazz = (Class<T>) 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<T> 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.skipAggregation.limit则是分页的操作;

说明:在上述示例中,只根据了两个属性进行group,那么返回的结果集合也只有这两个属性有值,该表中其他的字段为null

          如果要根据某字段排序,则要在last中添加该属性即可 。

去重:mongodb中的去重方法是Aggregation.distinct(去重字段),不过该方法只能对一个字段去重,多个字段去重就参照上面             的group方法,去重之后的结果集合也只有去重字段有值,其他字段为null。

                  

猜你喜欢

转载自blog.csdn.net/LiaoHongHB/article/details/83579030