mongodb游标查询

343 阅读1分钟

mongo游标查询条件不能使用Query spring封装类,只能使用mongo原生的查询条件;游标查询适合全量的遍历,不适用于分页操作

StopWatch sw = new StopWatch();
sw.start("导出开始执行");
cursor = objectBaseService.findAllByCursor(bkObjId);
List<Map<String, Object>> list = new ArrayList<>(1000);

while (cursor.hasNext()) {
    list.add((Map<String, Object>) cursor.next());
    if (list.size() == 1000) {
        excelWriter.write(dataList(bkObjId, objAttDesVisible, list), writeSheet);
        list.clear();
    }
}

if (list.size() > 0) {
    excelWriter.write(dataList(bkObjId, objAttDesVisible, list), writeSheet);
    list.clear();
}
sw.stop();
log.info("exportInst完成: {},耗时:{}s", bkObjId, sw.getTotalTimeSeconds());
public MongoCursor<Map> findAllByCursor(String bkObjId) {
    String collectionName = WhaleUtil.getCollectionName(bkObjId);
    Document query = new Document();
    if (!bkObjId.equals(Constant.biz) && !bkObjId.equals(Constant.host) && !bkObjId.equals(Constant.set) && !bkObjId.equals(Constant.module)) {
        query.put(ObjectBaseConstant.bk_obj_id, bkObjId);
        query.put(ObjectBaseConstant.data_status, ObjectBaseConstant.valid);
    }
    return mongoTemplate.getCollection(collectionName).find(query, Map.class).batchSize(1000).cursor();
}