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

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();

文章持续更新,可以关注下方公众号或者微信搜一搜「 最后一支迷迭香 」第一时间阅读,获取更完整的链路资料。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MongoDB中,LookupOperation可以被用于联表查询。通过MongoTemplate可以调用LookupOperation来执行联表查询并进行分页排序操作。 以下是示例代码: 首先,定义两个实体类,其中一个实体类包含对另一个实体类的引用,用于联表查询: ``` @Data @NoArgsConstructor @AllArgsConstructor @Document public class Book { @Id private String id; private String title; private String author; private int price; private String categoryId; } @Data @NoArgsConstructor @AllArgsConstructor @Document public class Category { @Id private String id; private String name; } ``` 然后,使用LookupOperation进行联表查询,并进行分页排序: ``` public Page<BookDTO> findAllWithCategoryName(Pageable pageable) { LookupOperation lookupOperation = LookupOperation.newLookup(). from("category"). localField("categoryId"). foreignField("_id"). as("category"); Sort sort = Sort.by(Sort.Direction.ASC, "title"); Aggregation aggregation = Aggregation.newAggregation(lookupOperation, Aggregation.sort(sort), Aggregation.skip(pageable.getOffset()), Aggregation.limit(pageable.getPageSize())); AggregationResults<BookDTO> result = mongoTemplate.aggregate(aggregation, "book", BookDTO.class); return new PageImpl<>(result.getMappedResults(), pageable, result.getMappedResults().size()); } ``` 在上述代码中,lookupOperation定义了联表查询,localField指定了本表(book)中用于连接的字段,foreignField指定了外表(category)中用于连接的字段,并且指定了as作为查询结果中外表的名称。 sort定义了查询结果的排序方式。 最后,通过Aggregation.newAggregation定义了查询管道,skip和limit指定了分页参数,使用mongoTemplate.aggregate方法执行查询操作,并将结果封装成Page返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

最后一支迷迭香

您的赞赏将给作者加杯☕️

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

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

打赏作者

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

抵扣说明:

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

余额充值