洧杰 已發佈 2019-11-25

十分鐘建立雲端 Firestore 資料庫

身為前端工程師的我,其實都對 NoSQL 比較拿手,例如 MongoDB、Firebase 的 Realtime Database。但由於 W3Hexschool 的網站是用 Firestore 開發的,也讓我對它產生十足的好奇,也因此有這篇教學文。

什麼是 Firestore

引述官網內容

Cloud Firestore 是一種託管在雲端的 NoSQL 數據庫,您的 iOS、Android 和網頁應用可以直接通過原生 SDK 訪問它。除了 REST API 和 RPC API 之外,在原生 Node.js、Java、Python 和 Go SDK 中也可以使用 Cloud Firestore。

如何開始使用 Firestore

步驟一:前往官網,並用 Google 帳號登入

步驟二:新增專案

點選右上方的「主控台」,進入專案列表。

images

進入後,點選新增一個專案,並依照他的步驟選擇下一步即可。

images

步驟三:新增應用程式

Firebase 擁有很多功能,尤其又可用在各個應用程式上,例如 Web、Android、iOS,所以必須先在該專案上新增一個 Web 應用程式。點選專案後,可以進入他的主控台,進入後就可看下圖,並點選箭頭處,新增應用程式。

images

步驟四:新增 JS SDK

在新增應用程式後,他會提供給您讓到網頁上的 JS SDK,這裡附上範例程式碼。
載入內容有分三層,這裡我從上到下解釋,
最上面的 firebase-app.js 是核心 JS,第二個是依照你想載入的功能,個別載入,像是 Firestore,就是 firebase-firestore.js,Authentication 就是 firebase-auth.js。相關功能列表可觀看此連結

第三層就是你要載入的初始化設定,這樣你的網頁才知道要連到哪個專案的哪個應用程式,而 firebaseConfigapiKey 你可以想像是密碼,讓你有辦法造訪到該網站去。

最後三層都載入後就使用 firebase.initializeApp(firebaseConfig) 來進行專案初始化。

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.5.0/firebase-app.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
     https://firebase.google.com/docs/web/setup#available-libraries -->

<script src="https://www.gstatic.com/firebasejs/7.5.0/firebase-firestore.js"></script>
<script>
  // Your web app's Firebase configuration
  var firebaseConfig = {
    apiKey: "你的APIKEY",
    authDomain: "xxx",
    databaseURL: "xxx",
    projectId: "xxx",
    storageBucket: "xxx",
    messagingSenderId: "xxx",
    appId: "xxx"
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
</script>

步驟四:觀察是否環境建立成功

接下來你可以嘗試以下語法起手式,觀察是否有載入成功,如果有,console 就會顯示 Firestore 的各個功能。

// Initialize Firebase
var db = firebase.firestore();
console.log(db)

開始撰寫 Firestore 語法

Firestore 資料庫結構

我當初在看官方介紹時,有點摸不著頭緒,後來嘗試接觸後,就開始比較好理解。首先我們來看下 Firestore 的資料庫結構。

images

我的情境是,一個資料庫就是一個班級,我可以新增一個集合叫做 students,然後裡面會有個文件夾,因為要有文件夾,裡面才可以去寫該文件對應的資料。像是上圖就是標示說,一個 students 裡面有兩個學生,第一個學生他的欄位有兩個,一個是他的姓名為 tom,學號是 1。

我在 Firestore 有看到一張圖還蠻貼切的,也附上給各位參考。 collection 就是集合,document 就是文件,data 就是文件裡面所填寫的欄位

images

新增一位學生

Firestore 寫法也很直覺,同時支援 promise 語法,以下語法就是,他在 students 的集合裡面,動態新增一個文件,並將欄位用物件的方式寫入。

db.collection("students").add({
    no: 3,
    name: "Bob"
})
.then(function(docRef) {
    console.log("新增成功,id 是"+docRef.id);
})
.catch(function(error) {
    console.error("新增失敗原因: ", error);
});

此時你觀看你的資料庫,會發現 FireStore 的文件名稱是它預設幫你產生的英數亂數產生,例如 KM6oiewjAc2sMuGZ5gRY ,但假使你想要自己新增自己的文件名稱,就可以用 .doc(文件名稱)。來新增文件名稱,並使用 .set 來寫入該文件的資料,就不會是用 .add。也附上官方增加數據文件連結

var db = firebase.firestore();
db.collection("students").doc("five").set({
    no: 4,
    name: "Jane"
})
.then(function() {
    console.log("新增成功");
})

images

取得所有學生

這將會使用到 .getquerySnapshot,可以作為將資料庫的資料快照起來,並傳入供您使用,而要依序將快照裡的資料內容顯示出來,則需要使用 forEach 來條列,也附上官方讀取數據文件連結

var db = firebase.firestore();
var docRef = db.collection("students");
docRef.get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {

        console.log(doc.data());
    });
})

進階搜尋

如果你想撈取學號是 3 的學生,可以用 where,第一個參數是欄位名稱,第二個是條件,第三個是參數。所以.where("no","==",3)白話文意思就是,我要找每個文件裡面,**no** 欄位名稱是 3 的數字。

var db = firebase.firestore();
var docRef = db.collection("students");
docRef.where("no","==",3).get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        console.log(doc.data());
    });
})

除此之外,Firestore 也可以做各種複合查詢排序功能,設計分頁上也難不倒他。

總結與安全性評估

有很多人擔心說,Firestore 在 web 端,apiKey 都直接明碼顯示,這樣不是很不安全嗎?其實 Firestore 也有相當嚴謹的設定權限規則,而且在規則上,你也可以搭配 Firebase 的 Auth 身份驗證功能一起使用,這樣就能設定成說,必須要登入才擁有寫入資料庫功能,就萬事 ok 了。

參考文獻

關於筆者

暱稱:洧杰

介紹:六角學院校長,熱愛分享與交流的前端工程師,目前專注於兼容桌面/移動網頁前端開發,期間已協助數百位平面設計師,網頁設計師導入標準網頁設計。

文章列表 文章列表