zoukankan      html  css  js  c++  java
  • 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"}]

    有不懂的地方请留言

    我是个双鱼座的小王子,沉浸在自己的代码世界里,去探索这未知的世界,希望遇到更多的小伙伴一起前行!
  • 相关阅读:
    基于SSM框架web搜索功能的实现
    使用APICloud打包webapp
    mac如何运行vue项目
    前端和算法实现:给网站上加上自己的水印(以后用上)
    jQuery常用代码片段
    关于vscode的个人配置
    听说你想用git,安装一下咯
    vue创建项目的一种方法
    用js控制css动画效果@keyframes
    axios的封装和拦截
  • 原文地址:https://www.cnblogs.com/zxy-come-on/p/15744846.html
Copyright © 2011-2022 走看看