1、配置
1.1、pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.2、 application.yml 配置
spring:
data:
mongodb:
host: 192.168.20.101
port: 27017
database: test
username: accountUser
password: 123456
以上配置會報錯:org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{.......
改為以下方式:
spring:
data:
mongodb:
uri: mongodb://accountUser:123456@192.168.20.101:27017/test?authSource=admin # 開啟了用戶驗證
# uri: mongodb://192.168.20.101:27017/test
注意:uri 中的用戶必須是該數據庫自己的用戶, 如果使用 admin 數據庫的超級用戶也會報用戶驗證的錯誤。
一開始使用的用戶是 admin 數據庫的用戶,給的權限是 readWriteAnyDatabase ,插入數據時出現 用戶驗證的錯誤。
uri 格式: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
username:password@ 可選項,如果設置,在連接數據庫服務器之后,驅動都會嘗試登錄這個數據庫
host1 必須的指定至少一個host, host1 是這個URI唯一要填寫的。它指定了要連接服務器的地址。如果要連接復制集,請指定多個主機地址。
portX 可選的指定端口,如果不填,默認為27017
/database 如果指定username:password@,連接並驗證登錄指定數據庫。若不指定,默認打開 test 數據庫。
?options 是連接選項。如果不使用/database,則前面需要加上/。所有連接選項都是鍵值對name=value,鍵值對之間通過&或;(分號)隔開
authSource 是 options中的一個,表示 用戶名在那個數據庫上創建的,需在在該數據庫驗證。如果指定了實際連接的數據庫,且沒有設置 authSource,則authSource是實際連接的庫。如果都沒設置,則authSource是admin
連接方式:https://www.cnblogs.com/zhanglw456/p/14607392.html
2、mongoTemplate 基本使用
2.1 常用方法
mongoTemplate.findAll(Student.class): 查詢Student文檔的全部數據
mongoTemplate.findById(<id>, Student.class): 查詢Student文檔id為id的數據
mongoTemplate.find(query, Student.class);: 根據query內的查詢條件查詢
updateFirst(Query query, UpdateDefinition update, Class<?> entityClass) 更新匹配到的第一條
updateMulti(Query query, UpdateDefinition update, Class<?> entityClass) 更新多條
mongoTemplate.upsert(query, update, Student.class): 有就更新,無則新增
mongoTemplate.remove(student): 根據id刪除
mongoTemplate.remove(query, Student.class): 刪除
mongoTemplate.insert(student): 新增
2.2 Query對象
1 創建一個query對象(用來封裝所有條件對象),再創建一個criteria對象(用來構建條件)
2 精准條件:criteria.and(“key”).is(“條件”)
模糊條件:criteria.and(“key”).regex(“條件”)
3、封裝條件:query.addCriteria(criteria)
4、大於(創建新的criteria):Criteria gt = Criteria.where(“key”).gt(“條件”)
小於(創建新的criteria):Criteria lt = Criteria.where(“key”).lt(“條件”)
5、Query.addCriteria(new Criteria().andOperator(gt,lt));
6、一個query中只能有一個andOperator()。其參數也可以是Criteria數組。
7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))
2.3 代碼示例:
// 分頁 使用 Pageable 查詢
// 也可 直接使用query.skip(offset).limit(count) 查詢
Pageable pageable = PageRequest.of(page, count); // page 表示第幾頁,從 0 開始, count表示每頁條數
Query query = new Query();
//動態拼接查詢條件
if(StringUtils.isNotBlank(typeCtg)){
query.addCriteria(Criteria.where("type_ctg").is(typeCtg));
}
if(StringUtils.isNotBlank(type)){
query.addCriteria(Criteria.where("type").is(type));
}
if(StringUtils.isNotBlank(company)){
query.addCriteria(Criteria.where("company").is(company));
}
//獲取總條數
long count1 = mongoTemplate.count(query,AssetIdentifier.class);
List<AssetIdentifier> identifierList = mongoTemplate.find(query.with(pageable), AssetIdentifier.class); // 執行查詢
public void mongoTemplateSample(FormDataApproval formDataApproval) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(formDataApproval.getId()).and("tenant_id").is(formDataApproval.getTenantId()));
Update update = new Update();
update.set("process_id", formDataApproval.getProcessId());
List<FormDataApproval> list = new ArrayList<>();
list.add(formDataApproval);
/**
* 數據庫有,就新增, 沒有,就修改
*/
mongoTemplate.upsert(query, update, FormData.class, "formData");
/**
* 修改方法
*/
// 無實際意義,不推薦使用
mongoTemplate.update(FormDataApproval.class);
mongoTemplate.updateFirst(query, update, FormDataApproval.class, "formDataApproval");
mongoTemplate.updateMulti(query, update, FormDataApproval.class, "formDataApproval");
mongoTemplate.findAndModify(query, update, FormDataApproval.class, "formDataApproval");
/**
* 查詢方法
*/
mongoTemplate.find(query, FormDataApproval.class, "formDataApproval");
mongoTemplate.findOne(query, FormDataApproval.class, "formDataApproval");
mongoTemplate.findAll(FormDataApproval.class, "formDataApproval");
mongoTemplate.findById(formDataApproval.getId(), FormDataApproval.class, "formDataApproval");
/**
* 刪除方法
*/
mongoTemplate.remove(query, FormDataApproval.class, "formDataApproval");
mongoTemplate.findAndRemove(query, FormDataApproval.class, "formDataApproval");
mongoTemplate.findAllAndRemove(query, FormDataApproval.class, "formDataApproval");
/**
* 新增方法
*/
mongoTemplate.save(formDataApproval, "formDataApproval"); // 同upsert(),沒有新增,有修改
mongoTemplate.insert(formDataApproval, "formDataApproval");
mongoTemplate.insertAll(list);
}
參考:
https://www.jianshu.com/p/a576499769ae
https://blog.csdn.net/qq_37707251/article/details/85172545
https://blog.csdn.net/leinminna/article/details/101277443
官網api:
https://docs.spring.io/spring-data/data-mongo/docs/3.1.7/api/
https://docs.spring.io/spring-data/data-mongo/docs/3.1.7/api/org/springframework/data/mongodb/core/MongoTemplate.html
