安裝
檢視mongo可用版本
docker search mongo
安裝指定版本的mogo或者拉取最新版本的映象
docker pull mongo:latest
或者官網下載安裝包
https://www.mongodb.com/try/download/community-kubernetes-operator
下載完成解壓至自己的目錄
tar -zxvf mongodb-macos-x86_64-4.2.18.tgz
建立mongo資料持久化目錄
sudo mkdir -p /usr/local/var/mongodb
建立mongo資料庫日誌目錄
sudo mkdir -p /usr/local/var/log/mongodb
分配許可權
sudo chown my_mongodb_user /usr/local/var/mongodb
sudo chown my_mongodb_user /usr/local/var/log/mongodb
執行mongod服務
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
檢視是否啟動成功
ps aux | grep -v grep | grep mongod
shell操作mongo
mongo
初次安裝,只有幾個預設的資料庫
springboot程式查詢mongo可以藉助MongoRepository或者MongoTemplate
這裡的MongoRepository跟spring data jpa很像,由於繼承了CrudRepository或者ListCrudRepository和QueryByExampleExecutor所以基本的增刪改查操作都可以直接呼叫方法來實現
如果使用MongoRepository多欄位條件查詢時可能會很複雜,使用MongoTemplate查詢更為方便,這兩者的使用得依靠自己來區分哪種方式更為方便
比如一般的分頁以及排序查詢MongoRepository更為方便一些
而mongoTemplate只能靠mongoTemplate.query()來實現分頁的查詢
spring data jpa
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
解析查詢的方法名稱分為主語和謂語find…By,exists…By),第二部分形成謂詞,可以進一步操作如,find(或其他引入關鍵字)和By之間的任何文字可認為形容詞,除非使用結果限制關鍵字,如Distinct在要建立的查詢上設定不同的標誌,如根據使用者名稱去重複(findDistinctByUsername)或者使用Top/First來限制查詢結果(findFirstByUsername),排序之後取前3條資料(findTop3ByOrderByCreateTimeDesc)。
Repository中的特殊引數
除了基本型別引數,還可以支援Pageable和 Sort來進行分頁和排序
Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Pageable pageable);
分頁
使用Pageable引數來進行分頁,使用sort來排序,因為page分頁需要根據總數來進行分頁計算,判斷總共多少頁,是否有下一頁等等,如果只想分頁,不需要知道總共多少頁,可使用slice實現,根據屬性hasNext判斷是否有下一次分頁即可,因為計算總頁數需要總條數,使用page來接受會額外花費一次count查詢
如果只需要排序,可以在方法引數新增sort,可以使用page也可以使用list接受
在jpa查詢中,如果新增了pageable,但是不想分頁查詢,可以使用Pageable.unpaged(),如果不想使用排序可以使用Sort.unsorted(),如果傳入null值會報NPE
排序
定義排序表示式,可以多個條件同時排序
Sort sort = Sort.by("firstname").ascending().and(Sort.by("lastname").descending());
lambda條件表示式
TypedSort<Person> person = Sort.sort(Person.class);
Sort sort = person.by(Person::getFirstname).ascending().and(person.by(Person::getLastname).descending());
條數限制
在find...By中間可以使用其他限制詞,比如first或者top關鍵詞來限制查詢結果的條數,如果只寫first或者top,預設為1條,即findByFirst1 = findByFirst = findByTop
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
Slice<User> findTop3ByLastname(String lastname, Pageable pageable);
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);
如果是單條查詢,如findFirstByOrderByLastnameAsc可以將返回結果使用Optional來包裝避免NPE
Optional<User> findFirstByOrderByLastnameAsc();
常用關鍵詞
關鍵詞 | 描述 |
---|---|
find…By,read…By,get…By,query…By,search…By,stream…By | 一般查詢方法通常返回儲存庫型別 |
exists…By | 是否存在,一般返回boolean| |
count…By | 統計條數| |
delete…By,remove…By | 刪除方法,無返回結果(void) |
…First |
將查詢結果限制為結果的第一個 |
…Distinct… | 使用不同的查詢僅返回唯一的結果介於find(和其他關鍵字)和by。 |