使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询

  • Post author:
  • Post category:其他


1、普通查询条件

			Criteria criteria = new Criteria();
            if (status == 2){ // 全部
                criteria = Criteria.where("status").ne(StatusEnum.DELETED);

            }else if (status == SolitaireConstant.LAUNCH){ // 我发起的
                criteria = Criteria.where("userId").is(userId).and("status").ne(StatusEnum.DELETED);
            }

            Query queryPage = new Query(criteria);
            queryPage.with(Sort.by(Sort.Order.desc("createTime"))).skip((long) page.getCurrent() * page.getSize()).limit(page.getSize()); //分页
            List<StartSolitaireVO> list = mongoTemplate.find(queryPage, StartSolitaireVO.class,SolitaireConstant.START_SOLITAIRE_COLLECTION);

2、聚合查询(分组、排序、分页、连表)

// 连表
LookupOperation lookup = LookupOperation.newLookup()
                    // 关联的从表名字
                    .from(SolitaireConstant.START_SOLITAIRE_COLLECTION)
                    // 主表中什么字段与从表相关联
                    .localField("startSolitaireId")
                    // 从表中的什么字段与主表相关联
                    .foreignField("_id")
                    // 自定义的从表结果集名  与主表关联的数据归于此结果集下
                    .as("startVO");

            Criteria criteria = new Criteria();
            // 主表可能选择的条件
            criteria.and("userId").is(userId);

            // 从表可能选择的条件
            criteria.and("startVO.status").ne(StatusEnum.DELETED);

            // 将筛选条件放入管道中
            Aggregation aggregation = Aggregation.newAggregation(
                    lookup,
                    Aggregation.match(criteria),
                    Aggregation.group("startSolitaireId") // 分组的字段
                            .first("startSolitaireId").as("startSolitaireId")  // 映射的字段 并取别名
                            .first("userId").as("userId")
                            .first("interact").as("interact")
                            .first("createTime").as("createTime")
                            .first("startVO").as("startVO"),
                    Aggregation.sort(Sort.Direction.DESC,"createTime"), // 排序
                    Aggregation.skip((long) page.getCurrent() * page.getSize()),
                    Aggregation.limit(page.getSize())); // 分页
            AggregationResults<MySolitaireVO> aggregate = mongoTemplate.aggregate(aggregation, SolitaireConstant.MY_SOLITAIRE_COLLECTION, MySolitaireVO.class);
            List<MySolitaireVO> mappedResults = aggregate.getMappedResults();



版权声明:本文为qq_38374397原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。