//使用分组查询更快
LoginUser loginUserInfo = RequestUserInfo.getLoginUserInfo();
Document document = new Document();
document.put("deleted",false);
document.put("tenantId",loginUserInfo.getTenantId());
document.put("createdDate",new Document().append("$gte", DateRangeUtil.getMonthFirst()).append("$lte",Calendar.getInstance().getTime()));
Aggregation courseLearnerLogAgg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("tenantId").is(loginUserInfo.getTenantId()).and("deleted").is(false).and("createdDate").gte(DateRangeUtil.getMonthFirst()).lte(Calendar.getInstance().getTime())),
Aggregation.group("userId").sum("learnedTime").as("learnedTime")
);
List<CourseCatalogLearnerLog> courseLearnerLogs = mongoTemplate.aggregate(courseLearnerLogAgg, CourseCatalogLearnerLog.class, CourseCatalogLearnerLog.class).getMappedResults();
Map<String, Long> courseLearnerLogsMap = courseLearnerLogs.stream().collect(Collectors.toMap(CourseCatalogLearnerLog::getId, CourseCatalogLearnerLog::getLearnedTime));
//游标转换对象
Document fieldDocument=new Document();
fieldDocument.put("learnedTime",true);
fieldDocument.put("createdDate",true);
fieldDocument.put("userId",true);
List<Document> documentList = new ArrayList();
FindIterable<Document> projection =mongoTemplate.getCollection("courseCatalogLearnerLog").find(document).projection(fieldDocument);
MongoCursor<Document> mongoCursor =projection.iterator();
while (mongoCursor.hasNext()){
documentList.add(mongoCursor.next());
}
Map<String, Long> courseLearnerLogsMap = documentList.stream().collect(Collectors.groupingBy(item -> (String)item.get("userId"), Collectors.summingLong(item -> (Long)item.get("learnedTime"))));
游标与分组一起
List<Document> documentList = new ArrayList<>();
//筛选条件
documentList.add(new Document().append("$match",new Document().append("tenantId",loginUserInfo.getTenantId()).append("deleted",false).append("createdDate",new Document().append("$gte",DateRangeUtil.getBeforeNumDay(30)))));
//显示列
documentList.add(new Document().append("$project",new Document().append("userId",1).append("createdDate",new Document().append("$hour","$createdDate"))));
//根据createDate分组
documentList.add(new Document().append("$group",new Document().append("_id","$createdDate").append("userId",new Document().append("$addToSet","$userId"))));
//拆分
documentList.add(new Document().append("$unwind","$userId"));
//根据createDate分组
documentList.add(new Document().append("$group",new Document().append("_id","$_id").append("userNumber",new Document().append("$sum",1))));
//显示列
documentList.add(new Document().append("$project",new Document().append("createdDate","$_id").append("userNumber",1).append("_id",0)));
//降序
documentList.add(new Document().append("$sort",new Document().append("createdDate",1)));
AggregateIterable<Document> courseCatalogLearnerLog = mongoTemplate.getCollection("courseCatalogLearnerLog").aggregate(documentList);
MongoCursor<Document> iterator = courseCatalogLearnerLog.iterator();
List<Integer> dateList = new ArrayList<>();
List<Integer> peopleNumList = new ArrayList<>();
Document next;
while (iterator.hasNext()){
next= iterator.next();
dateList.add((Integer) next.get("createdDate"));
peopleNumList.add(next.get("userNumber") != null?(Integer)next.get("userNumber"):0);
MongoDB查询返回指定字段
原文地址:https://blog.csdn.net/MTonj/article/details/109605717
Query query = new Query();
query.fields().include("name");//包含该字段
query.fields().exclude("_id");//不包含该字段
mongoTemplate.find(query,entityClass,collectionName);