MongoDBTemplate 操作 MongoDB 分组,去重等操作

我在写项目的时候遇见 , 在 数学语文英语 考试成绩中找到本科成绩最最高.这类应用场景. 但是这不像mysql那样直接 max(学科) goup by 学科 直接找到最大.
我在网上找了好久也没有解决如何利用java代码分组查询
刚学MongoDB 对他也不是很了解
最后我决定自写一个 主要是利用map集合类

  @Override
  //这是先把MongoDB里所有数据查出来
    public List<Record> lookRecord() {
        Criteria criteria = new Criteria();
        Query query = new Query(criteria);
        List<Record> records = mt.find(query, Record.class);
        //调用map函数尽行处理
        return map(records);

    }

    public List<Record> map(List<Record> records) {
        // 用map集合挑选最后一次的登录记录  类似去重并排序
        Map<String, List> map = new HashMap<String, List>();
        for (Record item : records) {
//            集合没有该属性就添加   
            if (map.get(item.getUsername()) == null) {
                List list = new ArrayList();
                list.add(item.getFinalTime());
                map.put(item.getUsername(), list);
            } else {
                map.get(item.getUsername()).add(item.getFinalTime());
            }
//这里处理完后的map里面装的数据类型是
// { user1:[1,2,3,4],user2:[6,8,9]}
        }
      
      //再对map 进行操作

        //用来添加结果集
        List<Record> records1 = new ArrayList<Record>();
        //遍历map集合
        for (Map.Entry<String, List> entry : map.entrySet()) {

         //这里是我处理我对应的业务场景  ,   根据实际需要进行编写

         //Collections.max()  可以挑选出集合中最大的值   Collections.min() 最小值
            Record record = queryRecord(entry.getKey(), (String) Collections.max(entry.getValue()));
            
            if (entry.getValue().size() > 10) {
                //     如果记录超过10条就删除最开始的登录记录
                DeleteRecord(entry.getKey(), (String) Collections.min(entry.getValue()));
            }
            
            records1.add(record);
        }

        return records1;
    }

我的这个有一个很大的缺点是
如果处理数据成千上万 会很慢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值