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
