MongoRepository查詢資料常用語法

2023-03-09 21:00:56

安裝

檢視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,也可以使用int接受|
count…By|統計條數|
delete…By,remove…By 刪除方法,無返回結果(void)
…First…,…Top 將查詢結果限制為結果的第一個。此關鍵字可以出現在主題的任何地方,介於find(和其他關鍵字)和by。如前兩條findTop2By
…Distinct… 使用不同的查詢僅返回唯一的結果介於find(和其他關鍵字)和by。