昨天研究完文件,今天來研究集合和參照的概念吧!
正如昨天所述,所有文件都必須存在於集合之中,而集合就是一個作為文件容器的簡單存在。集合不會有任何的欄位與資料,就只是單純的把文件放進來而已。就像是我們可以建立一個名為 users 的集合,然後把儲存使用者資料的文件,以使用者的 ID 為文件名稱,放進這個集合裡,像是這樣:
users: {
"ruoshi": {
first : "Ruoshi"
last : "Lin"
born : 1900
}
}
但是在同一個集合裡,文件的 ID 是不能重複的,雖然是常識還是在這邊做個提醒。
而 Cloud Firestore 又不像 SQL 資料庫一樣受到 schema 限制,所以我們可以有完全的彈性自訂文件的欄位,甚至每個文件的欄位、與其型別要不一樣都沒關係。不過在規劃上還是會建議同個集合裡保持一致的資料節夠,這樣在查詢上才不會造成困擾。舉個簡單的例子,明明都是用來儲存名字的欄位,一個叫做 fullname
、一個叫做 name
,實在是頗為困擾。
另外,在 Cloud Firestore 中,不存在著空集合。也就是當我們把集合裡所有的文件都刪除時,這個集合也就會消失。相對的,我們也不用刻意去建立集合,只要說我要把某個文件放進某個集合裡時,那個集合就會自動被建立。正如前面所說,集合就是一個作為文件容器的簡單存在,沒了文件,這個存在也就消失了。
在 Cloud Firestore 資料庫中,每個文件都是透過其位置作為唯一的辨識方法。想要查詢資料就只要建立一個「參照」即可,以前面的資料為目標,透過 JS 和 Ruby 作為範例程式碼做舉例:
let userId = 'ruoshi'
let documentReference = db.collection('users').doc(userId)
user_id = 'ruoshi'
document_reference = firestore.col('users').doc(user_id)
參照的功用就只是指向資料庫的某個位置,而還沒進行查詢,所以我們甚至可以指向一個不存在文件的位置,也因為如此,建立參照本身並不會有任何的網路操作。
而除了參照文件外,我們也可以參照集合,只要把上面範例程式碼第二行敘述的 .doc()
方法拿掉即可,這邊就不再示例。然而,儘管如此,這兩種參照還是不一樣的,我們要將文件的參照和集合的參照是為兩種不一樣的物件,他們提供了不同的查詢介面。像是我們可以在集合參照查詢有什麼文件在這個集合裡,而可以透過文件參照去查詢裡面儲存了什麼資料。也正是在查詢時,才會正式對資料庫提出 Request。