本文只介紹常用的api,盡量以最簡單的形式學會mongoTemplate基礎api的使用
一、新增
主要包含三個api:insert(一個或遍歷插多個)、insertAll(批量多個)、save(插入或更新)
//這里簡單演示,具體要插入的數據自己構建哈User user = new User();
mongoTemplate.insert(user,集合名); //新增一個
mongoTemplate.save(user,集合名); //根據主鍵id判斷,如果數據庫中已有id就更新,沒有就新增List<User> list = new ArrayList<>();
mongoTemplate.insert(list,集合名); //新增多個(遍歷插入)
mongoTemplate.insertAll(list,集合名); //新增多個(批量插入,效率高)
二、刪除
從這里開始就要引入Criteria和Query的概念?
Criteria是條件邏輯(僅包含where部分),支持鏈式編程,一般寫法如下:
.where(第一個字段).is(精確匹配)
.and(其余條件).xxx(匹配條件)
常見匹配條件有這些:
.lt(value)? ?<value的
.lte(value)? ?≤value的
.eq(value)? ?=value的
.gte(value)? ?≥value的
.gt(value)? ?>value的
.in(a,b,c..)? ? ?元素符合a,b,c等等中的其中一個
.nin(a,b,c...)? ? 不符合a,b,c等等的任何一個
.exist(value)? ? 存在value字段的
.regex(String re)? ? 正則表達式匹配
Query是完整的查詢條件,在query可以添加其他邏輯(即limit,order by等等),支持鏈式編程,有以下功能:
.skip(long skip)? 跳過文檔的數量,配合limit做分頁(類似offset和limit)
.limit(int limit)? ?限制返回多少條
.with(Sort sort)? ? 設置排序
簡單說一下排序怎么用哈,舉個例子
.with(Sort.by(Sort.Direction.DESC,"classNo")),就是按classNO字段降序排序,我相信你懂了
最終mongoTemplate api通常要Query作為參數,構建方法有兩種:
①先創建Criteria,處理完傳入Query
②先new一個空Query,再手動add Criteria條件
//方法1
Criteria criteria = Criteria.where("name").is("hzj").and("id").is("0936"); //鏈式構造where條件
Query query = new Query(criteria); //創建查詢條件,把where條件傳進去//方法2
Query query = new Query();
query.addCriteria(Criteria.where("name").is("hzj"));
query.addCriteria(Criteria.where("id").is("0936"));
好繼續說刪除,如下。這里User.class可以不寫哈(如果寫了就是嚴格匹配,刪除符合查詢條件且符合實體類映射的文檔,如果不寫就是刪除符合查詢條件的)
Query query = new Query(Criteria.where("name").is("John"));
mongoTemplate.remove(query, User.class,集合名);
?三、修改
需要構建一個update對象,聲明你要改哪些地方
傳query(匹配要改的文檔),update(改什么),集合名
Query query = new Query(Criteria.where("name").is("John"));
Update update = new Update().set("age", 26);
//更新第一個匹配的文檔
mongoTemplate.updateFirst(query, update, 集合名);
//更新所有匹配的文檔
mongoTemplate.updateMulti(query, update, 集合名);
update提供的常見方法如下:
Update update = new Update();
// 設置字段值
update.set("field", value);
// 遞增數值
update.inc("count", 1);
// 添加元素到數組
update.push("items", item);
// 從數組移除元素
update.pull("items", item);
// 重命名字段
update.rename("oldName", "newName");
// 取消設置字段
update.unset("field");
四、查找
使用findOne函數,只查一條文檔;
// 創建查詢條件
Criteria criteria = Criteria.where("age").gt(20);
Query query = new Query(criteria);User user = mongoTemplate.findOne(query, User.class,集合名);
如果要查多條文檔就用find函數
// 創建查詢條件
Criteria criteria = Criteria.where("age").gt(20);
Query query = new Query(criteria);// 添加排序
query.with(Sort.by(Sort.Direction.DESC, "age"));//查詢符合條件的多個記錄
List<User> users = mongoTemplate.find(query, User.class,集合名);
//查詢符合記錄的條數
int count = mongoTemplate.count(query, User.class,集合名);
(如果你有主鍵id,也可以用findById函數,傳參依次是id、返參.class、集合名)?
五、聚合管道
有點厲害,這個可以取代query,也可以做聯表用,先介紹聯表怎么做:
在mongodb中使用aggregate聚合進行聯表(你可以理解為sql中的left join)
LookupOperation lookup = LookupOperation.newLookup().from("要關聯的集合名") // 對應 SQL 的 FROM 表.localField("當前集合字段") // 對應 SQL JOIN 的左邊字段.foreignField("關聯集合字段") // 對應 SQL JOIN 的右邊字段.as("輸出字段名"); // 關聯結果存放的字段名Aggregation aggregation = Aggregation.newAggregation(lookup);
AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, 集合名, Document.class
);
?可作where條件
// 等同于 find() 中的查詢條件
Aggregation.match(Criteria.where("status").is("A").and("qty").gt(10))
可做select用
// 選擇包含/排除字段,可重命名字段,計算新字段
Aggregation.project().and("name").as("productName") // 重命名.and("price").multiply(1.1).as("priceWithTax") // 計算.andExclude("_id") // 排除字段
可做group by用
// 按category分組,計算每組的統計值
Aggregation.group("category").count().as("count") // 計數.sum("qty").as("totalQty") // 求和.avg("price").as("avgPrice") // 平均值.max("price").as("maxPrice") // 最大值
可做order by用
Aggregation.sort(Sort.Direction.DESC, "totalQty", "avgPrice")
可做分頁用
Aggregation.skip(10),
Aggregation.limit(5)
還有展開數組,多維度聚合,圖搜索等功能,這里先不說(還沒咋學哈哈),后續再補?
如果多階段如下
// 統計各部門各年齡段的平均工資
Aggregation agg = Aggregation.newAggregation(Aggregation.match(Criteria.where("salary").gt(3000)), // 階段1:篩選Aggregation.group("department", "age") // 階段2:分組.avg("salary").as("avgSalary"),Aggregation.sort(Sort.Direction.DESC, "avgSalary"), // 階段3:排序Aggregation.limit(10) // 階段4:限制結果
);AggregationResults<Document> results = mongoTemplate.aggregate(agg, 集合名, Document.class
);