• mongodb去重分页查询支持排序


    需求:
    查询一张表,根据某字段去重后返回指定信息,支持分页,排序。
    逻辑:
    1,match查询符合条件的数据
    2,利用分组进行去重
    3,返回全部字段信息
    4,排序
    5,分页
    mongodb原生语句实现
    方法1 返回指定字段

    db.getCollection('表名').aggregate([
    {
    "$match" : {"failure":{$in:["具体失效文件"]}} //查询数组类型字段,根据需求可更改
    },
    {
    "$group" : {
    "_id": { "lawId": "$lawId" }, //需要去重的字段
    "id":{"$first" :"$_id"},
    "lawId": {"$first" :"$lawId"},
    "date":{"$first" :"$date"}
    }
    },
    {
    "$project": { //设置返回字段,建立在group基础上
    "_id": 1,
    "id":1,
    "lawId": 1,
    "date":1
    }
    },
    {"$sort": {"date":-1}}, //排序
    { "$skip":0 }, { "$limit":10 } //分页
    ])

    注意:表红色的为错误代码,加上的话,查询不出来

     

    优化后:

    db.getCollection('表名').aggregate([
    {
    "$match": {
    "createUserId": "1069"
    } //查询数组类型字段,根据需求可更改
    },
    {
    "$group": {
    "_id": "$entityId",
    "type": {
    "$first": "$type"
    },
    "entityId": {
    "$first": "$entityId"
    },
    "entityName": {
    "$first": "$entityName"
    },
    "createTime": {
    "$first": "$createTime"
    },
    "fileSize": {
    "$first": "$fileSize"
    }
    }
    },
    {
    "$sort": {
    "createTime": - 1
    }
    }, //排序
    {
    "$skip": 0
    },
    {
    "$limit": 10
    } //分页
    ])

    方法2 返回全部字段

    db.getCollection('表名').aggregate([
    {
    "$match" : {"failure":{$in:["具体失效文件"]}} //查询数组类型字段,根据需求可更改
    },
    {
    "$group" : {
    "_id": { "lawId": "$lawId" }, //需要去重的字段
    "data":{"$first" :"$$ROOT"} //返回全部字段
    }
    },
    {
    "$project": {
    "data":1, //返回全部字段
    }
    },
    {"$sort": {"data.dae":-1}}, //根据date.dae字段排序
    { "$skip":0 }, { "$limit":10 } //分页
    ])

    java代码MongoTemplate实现方法1

    public void searchListPages(ReqQyPage<DownrdListReq> req) {
    if(req.getActiveUser()==null){
    return ResultIf.FAIL("登录失效");
    }
    ResultIf<List<DowndDto>> res = null;
    Criteria criteria =Criteria.where("createUserId").is(String.valueOf(req.getActiveUser().getUid()));
    if (req.getData() != null) {
    //模糊查询:标题
    if (StringUtils.isNotEmpty(req.getData().getSearchText())) {
    // 构建查询条件
    criteria.and("entityName").regex(req.getData().getSearchText());
    }
    }

    // 分组查询分组后的总记录数
    Aggregation aggregation2 = Aggregation.newAggregation(
    Aggregation.match(criteria), //查询条件
    Aggregation.group("entityId") //分组条件
    );
    AggregationResults<DowndDto> aggregate2 = downloadRecordDao.aggregate(aggregation2);
    int totalCount = aggregate2.getMappedResults().size();
    List<DowndDto> data = null;
    if(totalCount>0){
    List <Sort.Order> orders = new ArrayList <Sort.Order> ();
    orders.add(new Sort.Order(Sort.Direction.DESC, "createTime"));
    Sort sort = Sort.by(Sort.Order.desc("createTime"));
    Aggregation aggregation = Aggregation.newAggregation(
    // sql where 语句筛选符合条件的记录
    Aggregation.match(criteria),
    // 分组条件,设置分组字段
    Aggregation.group("entityId")
    .first("type").as("type")
    .first("entityId").as("entityId")
    .first("entityName").as("entityName")
    .first("createTime").as("createTime")
    .first("fileSize").as("fileSize"),
    // 排序(根据某字段排序 倒序)
    Aggregation.sort(Sort.Direction.DESC,"createTime"),
    Aggregation.skip(req.getPage() * req.getSize()),//跳到第几个开始
    Aggregation.limit(req.getSize())//查出多少个数据
    );
    AggregationResults<DowndDto> results =
    downloadRecordDao.aggregate(aggregation);
    data = results.getMappedResults();
    }
    Pageable pageable = new Pageable((int) req.getPage(), (int) req.getSize(), totalCount);
    res = ResultIf.SUCCESS(data, pageable, ResultIf.SUCCESS);
    return res;
    }

    返回结果:
    参数:[{"createTime":1627522794893,"entityId":"61068791d843fb1","entityName":"U形","fileSize":"","id":"6102067823e268791d843fb1","type":"NDARD_PARTS"},{"createTime":1627367395374,"entityId":"60fe46daa5e8b6db","entityName":"U形螺1栓","fileSize":"","id":"60fe46daaa01256e65e8b6db","type":"STAN_PARTS"}]

    有不懂的地方请留言

    我是个双鱼座的小王子,沉浸在自己的代码世界里,去探索这未知的世界,希望遇到更多的小伙伴一起前行!
  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/zxy-come-on/p/15744846.html
Copyright © 2020-2023  润新知