赞
踩
在平常开发过程中,常常需要对数据表做连接查询、聚合查询等一系列查询操作,像常用的mysql数据库,有对应的"join in / join left / join right"以及"group by"等语法,而MongoDB要如何在Java编程中使用这些操作,下面是一个开发案例供参考。
程序中,需要引入的库为:
- import org.springframework.data.mongodb.core.MongoTemplate;
- import org.springframework.data.mongodb.core.aggregation.Aggregation;
- import org.springframework.data.mongodb.core.aggregation.LookupOperation;
假设存在两个表tableOne和tableTwo,其各自类型如下:
【tableOne】
| _id | ID |
| twoId | 表二ID |
| createdAt | 创建时间 |
【tableTwo】
| _id | ID |
| name | 名称 |
| type | 类型 |
对于表tableOne和表tableTwo的连接查询,在MongoDB中,可以使用 LookupOperation 进行初始化一个数据对象:
- LookupOperation lookupOperation = LookupOperation.newLookup()
- .from("tableTwo")
- .localField("twoId")
- .foreignField("_id")
- .as("OneAndTwo");
在此连接中,from()定义从表名;localField()定义主表关联字段;foreignField()定义从表关联字段;as()定义表连接后的结果名。
完成数据表连接后,可以使用 Aggregation 进行语句定义:
- // 定义查询的时间范围,开始时间当年第一天,结束时间当年最后一天
- LocalDateTime startTime = LocalDateTime.of(LocalDateTime.now().getYear(),1,1,0,0,0);
- LocalDateTime endTime = LocalDateTime.of(LocalDateTime.now().getYear(),12,31,23,59,59);
-
-
- // 对上面连接后的结果表执行查询
- Aggregation aggregation = Aggregation.newAggregation(
- lookupOperation
-
- // 设置查询时间范围为当年
- , Aggregation.match(Criteria.where("OneAndTwo.createdAt").gte(startTime).lte(endTime))
-
- // 根据前端传参对象的查询名称name,查询对应的数据,name为你要查询的字符串
- , Aggregation.match(Criteria.where("OneAndTwo.name").is(name))
-
- // 对数据库表数据的时间进行转换,转为对应的月份
- , Aggregation.project("createdAt")
- .andExpression("{$month: '$createdAt'}").as("createdAt")
-
- // 对数据库数据根据时间(月份)进行聚合,将聚合数存储在cout中
- , Aggregation.group("createdAt")
- .first("createdAt").as("createdAt")
- .count().as("count")
- );

在上面的代码中,主要查询的操作有:【1】查询时间范围;【2】查询连接表的name字段中与常量name保存的字符串相同的数据;【3】将数据库中的时间转换为对应的月份;【4】根据月份聚合,得到每个月份对应的统计数据。
查询语句完成后,便可以开始执行查询操作,在查询操作前需建立一个对象,该对象需具备的属性名称,应与查询过程中选择输出的字段名一致,比如上面的查询语句,将输出【_id】默认输出ID【createdAt】输出月份【cout】统计数据,因此应该创建一个对象如下:
- @Data
- public class saveCTX {
- private String _id;
- private String createdAt;
- private Integer count;
- }
创建一个如上的对象后,便可以使用 MongoTemplate进行查询,注意在查询前需要将MongoTemplate注入,否则在查询中会提示空值报错:
- @Autowired
- public FormStatisticsServiceImpl(MongoTemplate mongoTemplate) {
- this.mongoTemplate = mongoTemplate;
- }
之后就可以进行查询了,建立一个saveCTX列表进行保存操作,执行查询:
- // 创建一个对象列表,对象的属性需包含上面所设定字段,将上面数据库输出的数据存储返回
- List<saveCTX> saveCTXES = mongoTemplate.aggregate(aggregation, "OneAndTwo",saveCTX.class).getMappedResults();
这样,查询到的数据就会存储在saveCTXS这个对象中了,可以进行后续的操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。