mongodb之使用聚合方法条件排序查询

本文介绍了如何在SpringBoot应用中使用聚合方法处理带有条件的业务查询排序,包括使用mongosh脚本作为基础,以及处理分页逻辑,特别是针对`CondSortParam`参数的复杂排序操作。作者强调了正确编程和理解工具使用的重要性,指出依赖通用搜索可能无法深入理解工具的全部功能。

目录

一、springboot使用聚合方法处理业务查询排序心得

二、分页代码

三、对二中condSortParam参数进行加工后的程序

五、总结


一、springboot使用聚合方法处理业务查询排序心得

  1. 思路。此文编程部分思路大部分通过文心一言(免费版本即可) 获取。
    注意:但在首次使用所给的答案绕了远路,第二回通过给他发送明确的内容做基础,如发送 mongosh脚本后 给出了编码 才拿到正确的解答方式
    注意:在springboot中使用正确的方式编程,springboot中使用aggregate方法与使用mongosh 脚本基本方法名称相同, 不然会出现问题(奇怪的问题)
  2. 如下是提的问题。询问文心一言内容
  • 注意首先编写mongosh脚本进行查询。查询结果正确后。询问文心一言获取springboot的编程代码
    如:
    db.document.aggregate([{
         
         
            $addFields: {
         
         
                sortOrder: {
         
         
                    $cond: {
         
         
                        if: {
         
         
                            $eq: ["$status", "8"]
                        },
                        then: 1,
                        else: {
         
         
                            $cond:{
         
         
                                if: {
         
         
                                    $eq: ["$status", "9"]
                                },then: 2,
                                else: -1
                            }
                        }
                    }
                }
            }
        },
        {
         
         
            $sort: {
         
         
                sortOrder: -1,
                applyTime: -1
            }
        },{
         
         
            $project: {
         
         
                _id: 1,
                accNum: 1,
                status: 1,
                applyTime: 1
            }
        }
    ]);将上述脚本 用springboot 编程实现
    

二、分页代码

  • 注意:此代码为分页方法,传入的CondSortParam是经过加工后传入的,带有mongo聚合查询需要的AggregationOperation与SortOperation

  • 注意:Aggregation.newAggregation中 AggregationOperation参数的排列顺序会影像查询结果
    例如:

    排序1查询结果会先排序后通过条件进行处理。

     SortOpertion, AddFieldsOpertion.....
    

    解决方法:倒置:AddFieldsOpertion, SortOpertion...

    /*
     * 分页公共方法
     */
    public static <T> PageVO<T> pagination(PageRequestDTO dto, Class<T> tClass,
                                               MongoTemplate mongoTemplate, CondSortParam condSortParam) {
         
         
        # 获取查询条件
        Criteria criteria = handleCriteria(dto);
        // 添加查询条件
        MatchOperation matchOperation = Aggregation.match(criteria);
        // 计算总数, 分页
        Query query = new Query();
        query.addCriteria(criteria);
        if (!ObjectUtils.allNotNull(dto.getCurrentPageNum())) {
         
         
            dto.setCurrentPageNum(0);
        }
        if (!ObjectUtils.allNotNull(dto.getSize())) {
         
         
            dto.setSize(10);
        }
        long count = mongoTemplate.count(query, tClass);
        log.info("统计sql: {}", query);
        int offset = (dto.getCurrentPageNum() - 1) * dto.getSize();
        # 分页条件处理
        SkipOperation skipOperation = Aggregation.skip(offset);
        LimitOperation limitOperation = Aggregation.limit(dto.getSize());
        Aggregation aggregation = null;
        List<AggregationOperation> list = new ArrayList<>();
        if(condSortParam != null) {
         
         
            list.add(matchOperation
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胡斌附体

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值