今天就來研究怎麼開始用 SDK 在 Cloud Firestore 刪除資料吧。
若我們是要刪除文件內的某個欄位,可使用文件參照的更新方法,並將該欄位的值更新成 firebase.firestore.FieldValue.delete()
即可,如下所示:
let taichungRef = db.collection('cities').doc('taichung')
taichungRef.update(function() {
districts: firebase.firestore.FieldValue.delete()
})
若是我們要刪除整份文件,則在獲取該文件參照後,使用 delete()
方法即可。一樣的,我們也可以透過 .then()
和 .catch()
針對成功與錯誤的狀態作出回應。
let taichungRef = db.collection('cities').doc('taichung')
taichungRef.delete().then(function() {
console.log('Document successfully deleted!');
}).catch(function(error) {
console.error('Error removing document: ', error)
})
但要注意的是,刪除文件不代表會刪除文件下面的子集合,我們仍然可透過相同的路徑去獲取子集合的參照與其下的內容。而在資料庫的控制台也看仍然看得到這些還有子集合但卻被刪除得文件,但會以斜體去表示。儘管如此,文件中就是被刪除了,我們無法在該文件所屬的集合中查詢到,也拿不到任何參照,直到我們重新建立。
那我們該怎麼刪除集合呢?還記得我們在 Cloud Firestore β - 3 學到的概念嗎?
在 Cloud Firestore 中,不存在著空集合。也就是當我們把集合裡所有的文件都刪除時,這個集合也就會消失。
對,概念上就是這麼簡單!刪除集合的方式就是把該集合裡的所有文件都刪除,該集合就會跟著消失。但事實上在實作時會需要考量到更多細節。
因為每刪除一個文件就是一個 request,如果一個集合裡面有大量的文件,那可想而知這個 requests 數量會多大。所以我們應該分成多是小量的批次進行刪除,去避免 OOM 的錯誤。而 Cloud Firestore 官方也建議刪除集合的行為應該在穩定的伺服器環境上進行,雖然行動裝置或 Web 的客戶端也是做得到,但會有安全和效能上的顧慮。
這裏以 Ruby 程式碼去示範一個刪除集合的簡陋方法,這不是一個最佳實踐:
cities_ref = firestore.col 'cities'
cities = cities_ref.get
cities do |city|
puts "Deleting document #{city.document_id}."
city.ref.delete
end
我們透過查詢(明天會講到查詢資料)取得整個集合的文件的資料,並且透過迭代針對一個個資料去取得參照,最後刪除。當迴圈跑完也就是文件全部刪除時,集合也就跟著消失了。