mongodbTemplate 调用 聚合函数aggregate 案例

List<DBObject> pipeline = new ArrayList<DBObject>();
        BasicDBObject group = new BasicDBObject();
        group.put("$group",
                        new BasicDBObject("_id", new BasicDBObject("quoteDate",
                                        new BasicDBObject("$substr", Stream.of("$quoteHistory.quoteTime", 0, 10)
                                                        .collect(Collectors.toList()))).append("quoteArea",
                                                                        "$quoteHistory.areaCode")).append("plateNos",
                                                                                        new BasicDBObject("$addToSet", "$quoteCar.plateNo")));
        BasicDBObject match = new BasicDBObject();
        match.put("$match", new BasicDBObject("quoteHistory.groupChannelId", groupId)
                        .append("quoteHistory.quoteStatus", new BasicDBObject("$in", quoteStatus))
                        .append("quoteHistory.quoteTime", new BasicDBObject("$gt", DateConverter.parseDate(dateStr))));

        pipeline.add(match);
        pipeline.add(group);
        AggregationOutput outPut = mongoTemplate.getCollection("quote_record").aggregate(pipeline);
        Iterator<DBObject> results = outPut.results().iterator();
        List<QuoteInfoLog> quoteLogList = new ArrayList<>();
        int i = 0;
        while (results.hasNext()) {
            DBObject dbObj = results.next();
            JSONObject jsonObj = JSONObject.fromObject(dbObj);
            String quoteDate = jsonObj.getJSONObject("_id").getString("quoteDate");
            String quoteArea = jsonObj.getJSONObject("_id").getString("quoteArea");
            JSONArray jsonArray = jsonObj.getJSONArray("plateNos");
            Set<String> plateNoSet = new HashSet<>();
            for(int j=0;j<jsonArray.size();j++) {
                plateNoSet.add(jsonArray.getString(j));
            }
            int count = plateNoSet.size();
            QuoteInfoLog quoteLog = new QuoteInfoLog();
            quoteLog.setQuoteDate(quoteDate);
            quoteLog.setAreaCode(quoteArea);
            quoteLog.setGroupId(groupId);
            quoteLog.setDeleteId(DeletedIdEnum.VALID.getKey());
            Method method = quoteLog.getClass().getDeclaredMethod("set" + upperFirstLetter(fieldName),
                            quoteLog.getClass().getDeclaredField(fieldName).getType());
            method.invoke(quoteLog, Integer.valueOf(count));

            quoteLogList.add(quoteLog);

            i++;
            if (i > batchExecAmount) {
                if ("insert".equals(opType)) {
                    dataStatisticsService.insertQuoteInfoLogSelective(quoteLogList);
                    i = 0;
                    quoteLogList.clear();
                } else if ("update".equals(opType)) {
                    dataStatisticsService.updateQuoteInfoLogSelective(quoteLogList);
                    i = 0;
                    quoteLogList.clear();
                }
            }
        }
        if ("insert".equals(opType) && quoteLogList.size() > 0) {
            dataStatisticsService.insertQuoteInfoLogSelective(quoteLogList);
        } else if ("update".equals(opType) && quoteLogList.size() > 0) {
            dataStatisticsService.updateQuoteInfoLogSelective(quoteLogList);
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值