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();
}