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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM