MongoTemplate 使用aggregate聚合查询

db.getCollection('trade').aggregate(
        [       
     // $match 在$group 前过滤分组前数据 $match在$group之后过滤分组后的文档 { $match : { CheckStatus :
"邮件复核不一致" } }, { $group : { _id : "$CheckStatus", tradePriceSum : {$sum : "$TradePrice"}, undlRoundingSum : {$sum : "$UndlRounding"} } }, ] )

java 

package com.htsc.thfx.framework.controller;

import com.htsc.thfx.framework.vo.ResultMessage;
import com.mongodb.BasicDBObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


@RestController
@RequestMapping("/mongo")
public class MongoController extends BaseController {
    @Autowired
    MongoTemplate mongoTemplate;

    @GetMapping("/find")
    public ResultMessage find(String[] keys, String[] values, String[] queryKey, @RequestParam(defaultValue = "trade") String collectionName) {
        // 筛选条件
        BasicDBObject dbObject = new BasicDBObject();
        for (int i = 0; i < keys.length; i++) {
            dbObject.put(keys[i], values[i]);
        }
        //指定返回的字段
        BasicDBObject fieldsObject = new BasicDBObject();
        for (String s : queryKey) {
            fieldsObject.put(s, true);
        }
        Query query = new BasicQuery(dbObject.toJson(), fieldsObject.toJson());
        List<HashMap> result = mongoTemplate.find(query, HashMap.class, collectionName);
        return success(result);

    }

    @GetMapping("/group")
    public ResultMessage group(String[] keys, String[] values,@RequestParam String groupKey, String[] queryKey, @RequestParam(defaultValue = "trade") String collectionName) {
            // 聚合操作
            List<AggregationOperation> operations = new ArrayList<>();
            // 筛选条件
            for (int i = 0; i < keys.length; i++) {
                //operations.add(Aggregation.match(new Criteria(keys[i]).is(values[i])));
                operations.add(Aggregation.match(Criteria.where(keys[i]).is(values[i])));
            }

            // 分组字段
            GroupOperation groupOperation = Aggregation.group(groupKey);
            // 聚合查询字段
            for (int i = 0; i < queryKey.length; i++) {
                groupOperation = groupOperation.sum(queryKey[i]).as(queryKey[i]);
            }
            // 添加选项  (聚合查询字段和添加筛选是有区别的注意)
            operations.add(groupOperation);

            // 最终聚合查询所有信息
            Aggregation aggregation = Aggregation.newAggregation(operations);
            // 查询结果
            AggregationResults<HashMap> results = mongoTemplate.aggregate(aggregation, collectionName, HashMap.class);
            //获取结果
            List<HashMap> result = results.getMappedResults();
            return success(result);
    }
}

 

转载于:https://www.cnblogs.com/ronniery/p/10622565.html

使用MongoTemplate进行聚合查询来获取数据总数,您可以使用Aggregation类和AggregationOperation接口来构建聚合查询。以下是使用MongoTemplate来查询名为attendance的集合中数据总数的示例代码: ```java import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.CountOperation; import org.springframework.data.mongodb.core.query.Criteria; public class Main { private final MongoTemplate mongoTemplate; public Main(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public long getAttendanceCount() { CountOperation countOperation = Aggregation.count().as("count"); Aggregation aggregation = Aggregation.newAggregation( Aggregation.match(Criteria.where("collectionName").is("attendance")), countOperation ); AggregationResults<CountResult> results = mongoTemplate.aggregate(aggregation, "system.namespaces", CountResult.class); CountResult countResult = results.getUniqueMappedResult(); if (countResult != null) { return countResult.getCount(); } else { return 0; } } public static void main(String[] args) { // 创建MongoTemplate实例 // MongoTemplate mongoTemplate = ...; Main main = new Main(mongoTemplate); long count = main.getAttendanceCount(); System.out.println("Attendance count: " + count); } private static class CountResult { private long count; public long getCount() { return count; } public void setCount(long count) { this.count = count; } } } ``` 请确保已经创建了MongoTemplate实例,并将其传递给Main类的构造函数。然后,可以调用getAttendanceCount方法来执行聚合查询并获取名为attendance的集合中的数据总数。聚合查询通过匹配条件来筛选出名为attendance的集合,然后使用count操作来计算文档数量。最后,从聚合结果中提取计数值并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值