我在写项目的时候遇见 , 在 数学语文英语 考试成绩中找到本科成绩最最高.这类应用场景. 但是这不像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;
}
我的这个有一个很大的缺点是
如果处理数据成千上万 会很慢