MongoTemplate的分组与联表
Criteria criteria = Criteria.where("classId").is(classId).and("deleted").is(false);
GroupOperation groupOperation = group("userId").max("score").as("score")
.last("classId").as("classId")
.last("userId").as("userId")
.last("score").as("score")
.last("subjectId").as("subjectId")
.last("deleted").as("deleted");
List<AggregationOperation> list = new ArrayList<>();
list.add(match(criteria));
list.add(groupOperation);
Aggregation aggregation = newAggregation(list);
aggregation.withOptions(AggregationOptions.builder().allowDiskUse(true).build());
return mongoTemplate.aggregate(aggregation, taskId, User.class).getMappedResults();
如上为简单的分组查询,是根据用户id分组并查询每个人的最好成绩的科目信息。
-
Criteria搜索条件
-
GroupOperation 分组操作类
按指定的
_id
表达式对 Importing 文档进行分组,并针对每个不同的分组输出文档。每个输出文档的_id
字段包含唯一的按值分组。输出文档还可以包含包含某些accumulator expression值的计算字段。- group为分组field
- max为查询最大值,还有min(),avg()等函数可用
LookupOperation lookupOperation = LookupOperation.newLookup().
from(collection).
localField("fileId").
foreignField("fileId").
as("others");
Criteria cri = Criteria.where("workId").is(workId);
AggregationOperation match = Aggregation.match(cri);
// 需要的字段
ProjectionOperation project = Aggregation.project("_id","fileId", "name","others");
List<AggregationOperation> operations = new ArrayList<>();
operations.add(lookupOperation);
operations.add(match);
operations.add(project);
Aggregation aggregation = Aggregation.newAggregation(operations);
AggregationResults<Map> results = resultMongoTemplate.aggregate(aggregation, collection, Map.class);
List<Map> mappedResults = results.getMappedResults();
如上为简单的联表查询,根据fileId字段进行关联,并将结果集放到others字段中(这里的others字段是数组,若关联查询到多条,则others里是多条,与Mysql不同)
-
LookupOperation为联表查询操作
对* same *数据库中的未分片集合执行左外部联接,以过滤“联接”集合中的文档以进行处理。 $lookup阶段向每个 Importing 文档添加一个新的数组字段,其元素是“ joined”集合中的匹配文档。 $lookup阶段将这些重塑的文档传递到下一个阶段。
- from()为联表的表名
- localField()为当前表字段
- foreignField()为联表字段
- as()为关联查询结果的字段名
-
ProjectionOperation为字段查询筛选
将带有请求字段的文档传递到管道的下一个阶段。指定的字段可以是 Importing 文档中的现有字段,也可以是新计算的字段。
以上两个例子中我们使用Aggregation.newAggregation(operations)是将所有的查询条件聚合起来,一起进行查询。
在List
一般我们在使用MongoTemplate进行复杂查询的时候,主要用到的就是AggregationOperation接口实现的类,我们此次只简单的使用了GroupOperation 与LookupOperation两种,其他的使用方法可以看具体的官方文档。
文档链接: https://www.docs4dev.com/docs/zh/mongodb/v3.6/reference/reference-operator-aggregation-pipeline.html