【mongodb】--自定义排序规则

这篇具有很好参考价值的文章主要介绍了【mongodb】--自定义排序规则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、说明

最近项目接到一个功能点,需要对状态值status字段按照规则排序。这个status在表存储的是String纯字母,另外排序要求又不能按照字典排序方法。那这种问题如何解决?
MongoDB暂时只支持按照某些字段的升序或者降序排列。但是,在某些特别场景下, 比如对中文有要求按照指定规则排序,此时就是MongoDB的自定义排序规则。

二、代码案例实现

通过集合方式来自定义查询文章来源地址https://www.toymoban.com/news/detail-707876.html

       Criteria criteria = new Criteria();
        criteria.and("sid").is(000000L);
        criteria.and("file_type").in(Arrays.asList("PPTX", "DOCX"));

        List<AggregationOperation> operations = new ArrayList<>();
        Fields fields = Fields.fields("id","create_time","update_time","status");
        // 添加查询条件
        operations.add(Aggregation.match(criteria));
        if("desc".equals(order)){
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("notStarted")).then("1").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("going")).then("2").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("success")).then("3").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("fail")).then("4").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields).and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("error")).then("5").otherwiseValueOf("status")));

operations.add(Aggregation.sort(Sort.by(Sort.Direction.DESC, "update_time","status")));
}else{
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("notStarted")).then("5").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("going")).then("4").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("success")).then("3").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("fail")).then("2").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("error")).then("1").otherwiseValueOf("status")));
            operations.add(Aggregation.sort(Sort.by(Sort.Direction.ASC, "update_time","status")));
        }

        // 设置分页参数
        operations.add(Aggregation.skip((page-1)*size));
        operations.add(Aggregation.limit(size));
        // 根据上面自定义的排序规则将对应的数据转换回来
        if("desc".equals(order)){
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("1")).then("notStarted").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("2")).then("going").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("3")).then("success").otherwiseValueOf("status")));
            operations.add(Aggregation.project(fields)
                    .and("astatus").applyCondition(ConditionalOperators.when(Criteria.where("status").is("4")).then("fail").otherwiseValueOf("status")));
          
            operations.add(Aggregation.project(fields)
                    .and("status").applyCondition(ConditionalOperators.when(Criteria.where("status").is("5")).then("error").otherwiseValueOf("status")));
          
        }else{
            //todo  类似
        }

        Aggregation aggregation = Aggregation.newAggregation(operations);
        AggregationResults<JSONObject> aggregationResults = mongoTemplate.aggregate(aggregation, "test_record", JSONObject.class);
        List<JSONObject> templateList = aggregationResults.getMappedResults();
      

到了这里,关于【mongodb】--自定义排序规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch[七]:ES评分规则详解[查询评分规则、自定义评分规则]

    因为需要对搜索结果进行一个统一化的评分,因此需要仔细研究 ES 本身的评分规则从而想办法把评分统一。 省流:无法确切统一化 之前有说过 ES 的查询评分原理,那么仔细思考之后就会发现,长文本搜索对应的 score 会比短文本搜索的 score 高很多:score = 单个分词评分之和

    2024年01月20日
    浏览(84)
  • List按指定规则排序的四种方法

    使用Collections.sort(list)可对一个List对象进行升序排序,但如果要按某种指定规则进行排序,可使用如下四种方法: 1. 使用list.sort(comparator)方法 List的sort()方法中可以传入一个自定义Comparator比较器。实现Comparator接口, 重写compare方法 来定义排序规则。 如果compare()方法返回负整

    2024年02月05日
    浏览(46)
  • Mysql 创建数据库字符集与排序规则

    新版本数据库默认编码格式是  utf8mb4 , utf8mb4  比  utf8  多了  emoji  编码支持,建议普通表使用  utf8  如果这个表需要支持  emoji  就使用  utf8mb4 ,也可以全部用  utf8mb4 , utf8mb4 完全向下兼容 utf8 。 字符集 当数据库需要适应不同的语言就需要有不同的字符集,如果不指

    2024年02月07日
    浏览(47)
  • 工作中mongoDB排序内容超出sort默认内存

    org.springframework.data.mongodb.UncategorizedMongoDbException: Query failed with error code 96 and error message ‘Executor error during find command :: caused by :: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.’ on server mongodb.miniserver.com:27017; nested exception is com.mongodb.MongoQuery

    2024年02月10日
    浏览(44)
  • 【c语言】对结构体数组按照某项规则进行排序

            这是基于qsort()函数进行的简单排序。(附带其他类型的数组使用qsort()进行的排序) 目录 一、qsort()函数 二、compare()函数 1.结构体数组 1)升序实现 2)降序实现 2.整型数组 为什么不直接返回 ab(a )? 如果就是想用 ab(a )返回?  1)升序实现 2)降序实现 3.浮点

    2024年02月03日
    浏览(45)
  • docker镜像版本号规则定义

    major version.minor version.patch version 是一种常用的版本号命名规则,也被称为语义化版本号(Semantic Versioning)。其中: major version :表示主要版本号,当软件发生不兼容的变化时需要更新此版本号; minor version :表示次要版本号,当软件增加新功能但仍然向下兼容时需要更新此版

    2024年01月17日
    浏览(28)
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    使用 sort() 方法对结果进行升序或降序排序。 sort() 方法接受一个参数用于“字段名”,一个参数用于“方向”(升序是默认方向)。 示例 按名称按字母顺序对结果进行排序: 要删除一个文档,我们使用 delete_one() 方法。 delete_one() 方法的第一个参数是一个查询对象,用于定

    2024年01月15日
    浏览(40)
  • 如何使用自定义的CSS规则来定义特定类型的元素样式

    当我们需要对某些特定类型的元素进行样式定义时,可以使用自定义的CSS规则来实现。下面我们将从新手的角度,用幽默的语气来解释如何使用自定义CSS规则来定义特定类型的元素样式。 首先,让我们来看看如何使用自定义CSS规则来定义特定类型的元素样式。假设我们有一个

    2024年02月05日
    浏览(55)
  • MySQL 知识点分享一:utf8 字符集和排序规则

    我们经常能在数据库中看到这些: utf8mb4 和 utf8, utf8mb4_unicode_ci, utf8mb4_general_ci, utf8mb4_bin 分别代表什么意思呢? 其实他们表示的是字符集 和 排序规则 字符集:就是用来定义字符在数据库中的编码的集合。 排序规则:用来定义比较字符串的方式。 字符集和排序规则是一对多的关

    2024年02月07日
    浏览(48)
  • 使用ETLCloud强大的自定义规则实现自定义数据处理算法

    实时数据处理规则有什么作用 ? 在大数据中的实时数据采集、ETL批量数据传输过程中很多数据处理过程以及数据质量都希望实时进行处理和检测并把不符合要求的脏数据过滤掉或者进行实时的数据质量告警等。 在数据仓库建设过程中,每家企业的数据处理过程中肯定会有一

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包