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中,可以将多个AggregationOperation条件一起使用。


一般我们在使用MongoTemplate进行复杂查询的时候,主要用到的就是AggregationOperation接口实现的类,我们此次只简单的使用了GroupOperationLookupOperation两种,其他的使用方法可以看具体的官方文档。

文档链接: https://www.docs4dev.com/docs/zh/mongodb/v3.6/reference/reference-operator-aggregation-pipeline.html

posted @ 2020-08-31 17:06  faylinn  阅读(1956)  评论(0编辑  收藏  举报
、、、