MongoDB 聚合操作

Spring-MongoDB

造数

public class MongoDataGenerator {
    private List<String> optTypes;
    private List<String> nds;
    private List<String> mls;
    private List<String> lxs;
    private List<UserInfo> userList;

    @Before
    public void setup() {
        userList = new ArrayList<>();
        CollectionUtils.addAll(userList,
                new UserInfo("10001", "A0001", "X1111111", "Emp_BT_3"),
                new UserInfo("10002", "A0001", "X1111111", "Emp_BT_3"),
                new UserInfo("10003", "A0001", "X1111111", "Emp_BT_3"),

                new UserInfo("10002", "A0001", "X1111112", "Emp_BT_4"),
                new UserInfo("10002", "A0001", "X1111112", "Emp_BT_4"),
                new UserInfo("10002", "A0001", "X1111113", "Emp_BT_5"),

                new UserInfo("10004", "B0003", "X1111114", "Emp_BT_6"),
                new UserInfo("10005", "B0004", "X1111115", "Emp_BT_7"),

                new UserInfo("10006", "B0005", "X1111116", "Emp_BT_8"),
                new UserInfo("10006", "B0005", "X1111116", "Emp_BT_8"),
                new UserInfo("10007", "B0005", "X1111117", "Emp_BT_9")
        );


        optTypes = new ArrayList<>();
        CollectionUtils.addAll(optTypes, "1", "2", "3");
        nds = new ArrayList<>();
        CollectionUtils.addAll(nds, "2015", "2019", "2020", "2021", "2023");
        mls = new ArrayList<>();
        CollectionUtils.addAll(mls, "文书档案", "科技档案", "会计档案", "基建档案", "业务档案");
        lxs = new ArrayList<>();
        CollectionUtils.addAll(lxs, "AA类型", "CC类型", "BC类型", "CD类型");

    }

    @Test
    public void addUser() {
        MongoClient client = MongoClients.create("mongodb://aggtest:123456@192.168.1.20:27017/test-aggregation?readPreference=primary&ssl=false&directConnection=true");
        MongoTemplate mongoTemplate = new MongoTemplate(client, "test-aggregation");
        String collectionName = mongoTemplate.getCollectionName(OperationLog.class);


        ArrayList<OperationLog> list = new ArrayList<>();
        for (int i = 0; i < 300000; i++) {
            if ((i + 1) % 50 == 0) {
                mongoTemplate.insert(list, collectionName);
                list = new ArrayList<>();
            }
            UserInfo user = getRandVal2(userList);
            OperationLog log = OperationLog.builder()
                    .id(new ObjectId().toString())
                    .userId(user.getId())
                    .operType(getRandVal(optTypes))
                    .funId("fun_" + user.getBelongOrg())
                    .fondsId("Fonds_" + user.getBelongOrg())
                    .objId("obj_" + user.getBelongOrg())
                    .nd(getRandVal(nds))
                    .ml(getRandVal(mls))
                    .lx(getRandVal(lxs))
                    .belongOrg(user.getBelongOrg())
                    .secOrg(user.getSecOrg())
                    .thrOrg(user.getThrOrg())
                    .build();
            list.add(log);
        }

        if (!list.isEmpty()) {
            mongoTemplate.insert(list, collectionName);
        }
    }

    @Test
    public void test2() {
        for (int i = 0; i < 15; i++) {
            Random random = new Random();
            System.out.println(random.nextInt(3));
        }
    }

    private String getRandVal(List<String> values) {
        try {
            Random random = new Random();
            int i = random.nextInt(values.size());
            return values.get(i);
        } catch (Exception e) {
            System.out.println(values);
            throw new RuntimeException(e);
        }
    }

    private UserInfo getRandVal2(List<UserInfo> values) {
        try {
            Random random = new Random();
            int i = random.nextInt(values.size());
            return values.get(i);
        } catch (Exception e) {
            System.out.println(values);
            throw new RuntimeException(e);
        }
    }

    public enum OperType {
        view("1", "查看"), download("2", "下载"), print("3", "打印");
        private String value;
        private String name;

        OperType(String value, String name) {
            this.value = value;
            this.name = name;
        }
    }

    @Data
    @Builder
    static class OperationLog implements Serializable {
        private String id;
        private String userId;
        private String operType;
        private String funId;
        private String fondsId;
        private String objId;
        private String nd;
        private String ml;
        private String lx;
        private String belongOrg;
        private String secOrg;
        private String thrOrg;
    }

    @Data
    @AllArgsConstructor
    class UserInfo {
        private String id;
        private String secOrg;
        private String thrOrg;
        private String belongOrg;
    }
}

创建连接

MongoClient client = MongoClients.create("mongodb://aggtest:123456@192.168.1.20:27017/test-aggregation?readPreference=primary&ssl=false&directConnection=true");
mongoTemplate = new MongoTemplate(client, "test-aggregation");

按年度统计数量

@Test
    public void test_agg_by_nd() {

        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("operType").in("1", "2", "3")),
                Aggregation.group("fondsId", "nd").count().as("num"),
                Aggregation.addFields().addFieldWithValue("type", "7")
                        .addField("fondsId").withValue("$_id.fondsId")
                        .addField("dataGroup").withValue("$_id.nd")
                        .build()
        );
        System.out.println(aggregation);
        AggregationResults<StatisticLog> aggregate = mongoTemplate.aggregate(aggregation, "operationLog", StatisticLog.class);
        for (StatisticLog mappedResult : aggregate.getMappedResults()) {
            mappedResult.setId("");
            System.out.println(mappedResult);
        }
    }

按一级机构、二级机构统计数量

    @Test
    public void test_agg_by_jg_sec_unit() {
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("operType").in("1", "2", "3")),
                Aggregation.group("secOrg","thrOrg").count().as("num"),
                Aggregation.addFields().addFieldWithValue("type", "8")
                        .addField("fondsId").withValue("$_id.secOrg") //二级机构要转换为全宗ID
                        .addField("dataGroup").withValue("$_id.thrOrg") //分行下级机构
                        .build()
        );
        System.out.println(aggregation);
        AggregationResults<StatisticLog> aggregate = mongoTemplate.aggregate(aggregation, "operationLog", StatisticLog.class);
        for (StatisticLog mappedResult : aggregate.getMappedResults()) {
            mappedResult.setId("");
            System.out.println(mappedResult);
        }
    }

按一级机构、二级机构统计人数

    @Test
    public void test_agg_rs_by_jg_sec_unit() {

        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("operType").in("1", "2", "3")),
                Aggregation.group("secOrg","thrOrg","userId"),
                Aggregation.addFields().addFieldWithValue("type", "7")
                        .addField("secOrg").withValue("$_id.secOrg")
                        .addField("thrOrg").withValue("$_id.thrOrg")
                        .addField("userId").withValue("$_id.userId").build(),
                Aggregation.group("secOrg","thrOrg").count().as("num"),
                Aggregation.addFields().addFieldWithValue("type", "7")
                        .addField("fondsId").withValue("$_id.secOrg")
                        .addField("dataGroup").withValue("$_id.thrOrg").build()

        );
        System.out.println(aggregation);
        AggregationResults<StatisticLog> aggregate = mongoTemplate.aggregate(aggregation, "operationLog", StatisticLog.class);
        for (StatisticLog mappedResult : aggregate.getMappedResults()) {
            mappedResult.setId("");
            System.out.println(mappedResult);
        }
    }
posted @ 2024-04-20 09:26  Dreamsrj  阅读(7)  评论(0)    收藏  举报