mongodb分组和 游标转换

//使用分组查询更快

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值