firebase delete サブコレクション

firebaseのdeleteについての記事がなかったのでまとめ

まず、Firebaseはdeleteする際、サブコレクションがあっても、firebaseはカスケードしない。(小モデルも同時に削除しない)

よって、サブコレクションを削除し、その上で、コレクションを削除する必要がある。

まずdeleteの処理をみてみる

    //サブコレクションを含めたdelete処理 引数のcollectionにはサブコレクションを渡す
    func delete(collection: CollectionReference, batchSize: Int = 100, completion: @escaping (Error?) -> ()){
        collection.limit(to: batchSize).getDocuments{ (docset, error) in
            //error occured
            guard let docset = docset else {
                completion(error)
                return
            }
            guard docset.count > 0 else {
                completion(nil)
                return
            }
            //batchはトランザクションのようなもの
            let batch = collection.firestore.batch()
            //batchをforEachで回して、削除する
            docset.documents.forEach{
                //forEachの中では$0でアクセスする
                batch.deleteDocument($0.reference)
                }
            //batchをコミットして保存
            batch.commit { (batchError) in
                if let batchError = batchError {
                    completion(batchError)
                }else {
                    //commit時にエラーがなければ deleteを実行
                    self.delete(collection: collection, batchSize: batchSize, completion: completion)
                }
            }
        }
    }

この上で、親コレクション削除時に、このメソッドを呼び出す

下記の場合は、アラートでdeleteを選択したときに deleteを呼び出す処理

    //delete
        let deleteAction = UIAlertAction(title: "Delete", style: .default) { (action) in
            self.delete(collection: Firestore.firestore().collection(THOUGHTS_REF).document(thought.documentId).collection(COMMENT_REF), completion:  { (error) in
                if let err = error{
                    debugPrint(err.localizedDescription)
                }else{                    Firestore.firestore().collection(THOUGHTS_REF).document(thought.documentId).delete(completion: { (error) in
                        if let error = error {
                            debugPrint(error)
                        }else{
                            alert.dismiss(animated: true, completion: nil)
                        }
                    })
                }
            })
        }

Nosqlは, コレクションとドキュメントで成り立っていることがわかります。
この記事のなかで、わかりにくい点は、コメントいただけると助かります。 必ず修正します。