iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1

上一篇,建立了firestore資料庫,並且成功與前端連接,讀取到資料庫的資料,那麼這一篇就來認識一下,什麼是 firestore、firestore可以做什麼。

什麼是 firestore?

firestore 是 NoSQL 資料庫

之前有提到 firestore 是 NoSQL 的資料庫,那什麼是 NoSQL 呢? 和 NoSQL 相對應的就是 SQL ,SQL 最主要是用來查詢關聯式資料庫

關聯式資料庫將不同的資料放在不同的表裡面存放,會建立不同表的關聯,並且使用查詢語法去查詢想要的資料,例如:

SELECT * FROM USERS WHERE age>20;

因此怎麼設計資料庫,資料庫的欄位與結構等等就是一個重要且複雜的工作。

而 NoSQL 強調的就是,不需要去強調不同表之間的關係,也不需要去設計資料庫的欄位。資料皆以 key-value pair 的方式,以 JSON 的格式儲存。也就不用去煩惱怎麼設計資料庫。非常適合對於後端沒有完整概念的前端入門後端的一個方法。

而 firestore 就是一個很棒一窺後端世界的好工具。

firestore 的集合與文件

在 firestore 雖然不用去設計資料庫的欄位,但是有兩項要認識的是集合(collection)與文件(document)

https://ithelp.ithome.com.tw/upload/images/20210928/201201072qjDTryRE8.png

在 google 官方文件說明,將 collection 比喻為資料夾,而將 document 比喻為資料夾的文件。
https://ithelp.ithome.com.tw/upload/images/20210928/20120107hSq3ySeFbp.png

也就是像這張圖片一樣,建立一個水果的集合,下面文件就是各個水果。當然水果的內容要記錄什麼也沒有強制規定一定都要一樣。

像是可以紀錄蘋果的價錢、香蕉的產地、橘子的樣貌、西瓜的品種不同的資訊都可以,端看自己的需求與操作,沒有任何強硬的限制。

操作firestore CRUD

簡單認識了什麼是firestore之後,接下來用 angular-fire 來對 firestore 做最基本的 CRUD的動作

假設要對於水果這個集合做各種動作,那麼先定義好水果的集合

fruitCollection = this.firestore.collection('fruits');

新增資料

新增資料,分為三種:

  1. 無記名新增: 只要新增資料,firestore會隨機指定一個id
  2. 隨機記名新增:不讓firestore隨機指定,而是在打到資料庫之前,自行隨機指定
  3. 指定名稱新增:名稱有重要的意義,自己指定特別名稱
addDataWithoutName(): void {
    this.fruitCollection.add({
      price: 20,
    });
  }

  addDataWithRandomName(): void {
    const id = this.firestore.createId();
    this.fruitCollection.doc(id).set({
      height: '18cm',
    });
		// 新增完可以直接拿 id 做下一步其他的操作
  }

  addDataWithSpecificName(): void {
    this.fruitCollection.doc('pineapple').set({
      weight: 600,
    });
  }

以上就是三個不同的方法打到資料庫之後,結果的呈現

https://ithelp.ithome.com.tw/upload/images/20210928/20120107nkQjNQlBY5.png

  • 如果不在乎文件的名稱的話,直接使用 add 的方法,帶入資料的內容即可。
  • 但是如果需要文件的名稱,又不講究文件名稱的話,可以使用內建的 createId 方法幫你產生id,再去建立內容。這樣的使用情境大多數為文件建立之後,馬上會去做更新的動作會常用到
  • 如果在意文件名稱的話,也可以自己指定,但是要注意的是,如果文件名稱和原有的重複的話,會直接 覆蓋原有的文件

更新資料

updateDoc():void{
    this.fruitCollection.doc('pineapple').update({
      price:200
    })
  }

更新資料非常簡單,只要指定文件名稱,使用 update 方法之後,只需要填入要更新的部分,就可以更新文件囉

https://ithelp.ithome.com.tw/upload/images/20210928/201201070lkiNel0AQ.png

像原本的的鳳梨只有重量的資訊,現在透過更新的方法加入價格的資訊

刪除資料

deleteDoc(){
    this.fruitCollection.doc('pineapple').delete()
  }

刪除資料的方法同樣很簡單,只要使用 delete的方法就好了。

以上的方法angular fire 都包裝成 promise 如果想要進行下一步的動作,使用 then 就可以繼續執行了。

如果想要使用 rxjs 的 observable的方式進行的話,只要將promise 轉換就好了

addDataWithoutName(): void {
    const add = this.fruitCollection.add({
      price: 20,
    });
    // 將 promise 轉換成 observable
    from(add).subscribe(() => {
      //下一步動作
    });
  }

讀取資料

angular fire 將讀取資料直接包裝成 observable 的方法,並且還有監聽變動的功能,也就是說只要資料庫有變動,會自動得到最新的資料,不用前端去呼叫檢查更新。這個就是 firestore 強大的地方

fruitList$: Observable<any[]> = this.fruitCollection.valueChanges();
fruitList: any[] = [];

getFruitList(): void {
  this.fruitList$.subscribe((fruitList) => (this.fruitList = fruitList));
}


上一篇
DAY12 - 使用 angular fire 操作firebase
下一篇
DAY14 - firestore 使用條件來進階查詢
系列文
做一個面試官無法拒絕的sideproject,當一個全能的前端30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言