springboot项目使用mongodb查询太慢

1.通过反复查询原因,最终确定,查询速度很快,最重要的是mongodb将查询出来的数据映射到实体属性中,这个过程太过耗费时间

方式1:

// 这个查询出来所有符合条件的数据集合,速度很慢,主要是这种方式的数据映射过程太过耗时:
public
List<MineUserDetail> findListByGid(String groupId) { Query query = new Query(Criteria.where("groupId").is(groupId).and("everyId").is(0L).and("status").is(0)); return mongoTemplate.find(query, MineUserDetail.class);
}

方式2:

//这种方式,MongoCursor,他是mongo的游标,不是立即从数据库中取出数据,而是在我们使用时才会取出数据。这时候需要我们手动映射数据
public List<MineUserDetail> findListByGid(String groupId) {
        DBObject query = new BasicDBObject();
        query.put("groupId",groupId);
        query.put("everyId",0);
        query.put("status",0);
        MongoCursor<Document> mongoCursor = mongoTemplate.getCollection("mine_user").find((Bson) query).iterator();
        List<MineUserDetail> list = convertData(mongoCursor, MineUserDetail.class);
        return list;
}
//利用反射+泛型,定义工具类
public <T> List<T> convertData(MongoCursor<Document> mongoCursor, Class<T> tClass){
    List<T> list = new ArrayList<>();
    Field[] fields = tClass.getDeclaredFields();
    T t = null;
    try {
        while (mongoCursor.hasNext()) {
            t = tClass.newInstance();
            Document obj = mongoCursor.next();
            for (Field field : fields) {
                field.setAccessible(true);
                String name = field.getName();
                if (ObjectUtils.isNotEmpty(obj.get(name))){
                    field.set(t,obj.get(name));
                }
            }
            list.add(t);
        }
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return list;
}

分页工具类:

public static <T> List<T> page(List<T> datalist, Integer page, Integer size) {
        List<T> list = new ArrayList<T>();
        if (datalist != null && datalist.size() > 0) {
            int cuurIdx = (page > 1 ? (page - 1) * size : 0);
            for (int i = 0; i < size && i < datalist.size() - cuurIdx; i++) {
                T user = datalist.get(cuurIdx + i);
                list.add(user);
            }
        }
        return list;
}

 

posted @ 2022-09-14 16:11  keyboard达人  阅读(2184)  评论(0编辑  收藏  举报