MongoTemplate是Spring Data MongoDB提供的一個Java編程接口,用于操作MongoDB數據庫。它提供了一系列方法和功能,以便進行數據的插入、更新、刪除和查詢等操作。
使用MongoTemplate,你可以通過編寫Java代碼與MongoDB進行交互,而無需直接編寫原生的MongoDB查詢語句。它提供了一些便捷的方法,如save、insert、update和remove,用于對文檔進行增刪改操作。同時,它還支持復雜的查詢條件和排序,以及聚合管道查詢等高級功能。
1 引用pom
<!--mongodb-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-data-mongodb</artifactId>
? ? ? ? </dependency>
2 Aggregation
? ? ?是一種強大的數據處理操作,它允許你對集合中的文檔進行多個階段的處理和轉換,以生成復雜的結果。
使用聚合操作,你可以對文檔進行分組、排序、過濾、投影、計算字段值、連接多個集合等操作,以實現更復雜的數據處理需求
$match?? ?過濾數據,輸出符合條件文檔?? ?where
$project?? ?修改輸入文檔結構(篩選展示文檔的鍵)?? ?個人理解(select)
$limit?? ?限制計算文檔結果返回數?? ?limit
$sort?? ?文檔排序?? ?order by
$group?? ?文檔分組?? ?group by
$skip?? ?跳過指定數量的文檔?? ?skip
$unwind?? ?展開數組(數組內容拆分顯示)?? ?無
$facet:用于在單個聚合管道中執行多個聚合操作,并將結果分組輸出。
3? 查詢方法
? ? @Override
? ? public List<Test> getList(Test search) {
? ? ? ?1 區間查詢
? ? ? ? Criteria ? criteriaInfo =
? ? ? ? ? ? ? ? Criteria.where("Time").gte(search.getStartTime()).lte(search.getEndTime());
? ? ? ?2 in 查詢
? ? ? ? ?criteriaInfo.and("Code").in(List<String>);
? ? ? ?3? or 查詢 兩個滿足1
? ? ? ? ?criteriaInfo.orOperator(
? ? ? ? ? ? ? ? ? ? Criteria.where("title").regex(值),
? ? ? ? ? ? ? ? ? ? Criteria.where("name").regex(值)
? ? ? ? ? ? );
? ? ?4 is 等于
? ? ? ?criteriaInfo.and("Status").is(值);
? ? 5 nin 不等于
? ? ? ?criteriaInfo.and("Time").nin(值);
6 ne?不等于某個值的條件
Criteria.where("Status").ne(0)
?
? ? ? ? List<AggregationOperation> aggregationList = new ArrayList<>();
? ? ? ? // Match操作,篩選?
? ? ? ? aggregationList.add(Aggregation.match( ?criteriaInfo));
? ? ? ? // 只查出 Test 中的字段 相當于 select *(字段)
? ? ? ? aggregationList.add(
? ? ? ? ? ? ? ? Aggregation.project("Time")
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? );
? ? ? ? Aggregation aggregation = Aggregation.newAggregation(aggregationList);
? ? ? ? List<Test> result;
? ? ? ? result = mongoTemplate.aggregate(
? ? ? ? ? ? ? ? aggregation, "Test", Test.class).getMappedResults();
? ? ? ? return null;
? ? }
?
2 查詢左連
? ? @Override
? ? public List<Test> getList(Test search) {
? ? ? ? Criteria criteria =
? ? ? ? ? ? ? ? Criteria.where("Time").gte(search.getStartTime()).lte(search.getEndTime());
? ? ? ? List<AggregationOperation> aggregationList = new ArrayList<>();
? ? ? ? // Match操作,篩選?
? ? ? ? aggregationList.add(Aggregation.match(criteria));
? ? ? ? // 只查出 Test 中的字段
? ? ? ? aggregationList.add(
? ? ? ? ? ? ? ? Aggregation.project("Time") //顯字段
? ? ? ? ? ? ? ? ? ? ?.andExpression("title2").as("title")? //替換顯示字段? ? ? ? ? ? ? ? ? ?.andExpression("ifNull(status, 0)").as("status")? //替換顯示字段? ?
? ? ? ? );
? ? ? ?// Lookup操作 左連接
? ? ? ? aggregationList.add(LookupOperation.newLookup()
? ? ? ? ? ? ? ? .from("test2") ? ? ? ? ? ?//關聯表名
? ? ? ? ? ? ? ? .localField("Time") ? ? // 主表中的關聯字段
? ? ? ? ? ? ? ? .foreignField("Time") ?//從表關聯的字段
? ? ? ? ? ? ? ? .as("test3")); ? ?//查詢結果表名
? ? ? ? Aggregation aggregation = Aggregation.newAggregation(aggregationList);
? ? ? ? List<Test> result;
? ? ? ? result = mongoTemplate.aggregate(
? ? ? ? ? ? ? ? aggregation, "Test", Test.class).getMappedResults();
? ? ? ? return null;
? ? }
3 查詢總記數
Map total = mongoTemplate.aggregate(aggregation, "test", Map.class).getUniqueMappedResult();
4 分頁
? ?List<AggregationOperation> aggregationList = new ArrayList<>();
aggregationList.add(Aggregation.skip((search.getPageNum() - 1) * search.getPageSize())); aggregationList.add(Aggregation.limit(search.getPageSize()));
5 排序
List<Test> dataList= new ArrayList<>(); dataList.sort(Comparator.comparing(Test::getTime).thenComparing(Test::getcode));
6 then(1).otherwise(0)
?是一個偽代碼,用來表示在數據聚合操作中的條件邏輯。它的作用是根據條件的滿足與否分別賦值不同的結果
new Criteria().andOperator(Criteria.where("Code").in(值) )).then(1).otherwise(0))
then
方法用來指定條件滿足時的賦值結果,otherwise
方法用來指定條件不滿足時的賦值結果