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);
}
}

浙公网安备 33010602011771号