删除Firestore集合中的所有文档

时间:2017-12-18 00:36:26

标签: swift google-cloud-firestore

我正在寻找一种清除整个系列的方法。我看到有一个批量更新选项,但这需要我知道集合中的所有文档ID。

我正在寻找一种方法来简单地删除集合中的每个文档。

谢谢!

编辑:以下答案是正确的,我使用了以下内容:

  func delete(collection: CollectionReference, batchSize: Int = 100) {
// Limit query to avoid out-of-memory errors on large collections.
// When deleting a collection guaranteed to fit in memory, batching can be avoided entirely.
collection.limit(to: batchSize).getDocuments { (docset, error) in
  // An error occurred.
  let docset = docset

  let batch = collection.firestore.batch()
  docset?.documents.forEach { batch.deleteDocument($0.reference) }

  batch.commit {_ in
    self.delete(collection: collection, batchSize: batchSize)
  }
}

}

8 个答案:

答案 0 :(得分:5)

firebase CLI中现在有一个选项可以删除整个Firestore数据库:

firebase firestore:delete --all-collections

答案 1 :(得分:4)

2020年更新的答案

您可以使用Node JS进行操作-(注意,他们使用了process,这是Web javascript中不可用的节点中的著名对象)

查看由Firebase托管的Github上的this代码段。我总是将该页面固定在浏览器上;)

// [START delete_collection]

async function deleteCollection(db, collectionPath, batchSize) {
  const collectionRef = db.collection(collectionPath);
  const query = collectionRef.orderBy('__name__').limit(batchSize);

  return new Promise((resolve, reject) => {
    deleteQueryBatch(db, query, resolve).catch(reject);
  });
}

async function deleteQueryBatch(db, query, resolve) {
  const snapshot = await query.get();

  const batchSize = snapshot.size;
  if (batchSize === 0) {
    // When there are no documents left, we are done
    resolve();
    return;
  }

  // Delete documents in a batch
  const batch = db.batch();
  snapshot.docs.forEach((doc) => {
    batch.delete(doc.ref);
  });
  await batch.commit();

  // Recurse on the next process tick, to avoid
  // exploding the stack.
  process.nextTick(() => {
    deleteQueryBatch(db, query, resolve);
  });
}

// [END delete_collection]

答案 2 :(得分:3)

没有API可以一次性删除整个集合(或其内容)。

来自Firestore documentation

  

要删除Cloud Firestore中的整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。如果您有更大的集合,则可能需要以较小批量删除文档以避免内存不足错误。重复此过程,直到您删除整个集合或子集合。

该文档中甚至还有一个Swift示例,因此我建议您尝试一下。

Firebase CLI的文档似乎暗示可以使用单个命令删除整个集合,但我自己还没有尝试过。如果这符合您的需求,我建议您查看(稀疏)documentation for the firestore:delete command

答案 3 :(得分:2)

以下javascript函数将删除任何集合:

deleteCollection(path) {
    firebase.firestore().collection(path).listDocuments().then(val => {
        val.map((val) => {
            val.delete()
        })
    })
}

这可以通过遍历每个文档并删除每个文档来实现。

或者,您可以使用Firestore的批处理命令并使用以下功能一次删除所有命令:

deleteCollection(path) {
    // Get a new write batch
    var batch = firebase.firestore().batch()

    firebase.firestore().collection(path).listDocuments().then(val => {
        val.map((val) => {
            batch.delete(val)
        })

        batch.commit()
    })
}

答案 4 :(得分:2)

我发现删除所有文档的最干净的方法。我唯一使用此功能的时间是在使用仿真器时,您只需将功能粘贴到控制台中即可:

// Paste this in:
function clearCollection(path) {
  const ref = firestore.collection(path)
  ref.onSnapshot((snapshot) => {
    snapshot.docs.forEach((doc) => {
      ref.doc(doc.id).delete()
    })
  })
}
// Use it like this:
clearCollection('layers')

如果您发现自己需要重复使用此代码,请将其另存为Chrome中的代码段,则可以轻松访问它,而不必一直将代码块粘贴到控制台中。您必须先运行代码段,然后才能从代码块对其进行访问。 Documentation

答案 5 :(得分:1)

在VueJS中测试

import db from '@/firebase/init' 

let ref = db.collection('YOUR_COLLECTION_NAME')

db.collection(path).onSnapshot(snapshot => {
    snapshot.docs.forEach(doc => {
        ref.doc(doc.id).delete()
        .catch(error => {
            console.log(error)
        })
    })
})

答案 6 :(得分:0)

您必须获取所有文档,然后使用批处理将其批量删除 附言我更喜欢try ... catch语法

    let deleteInBatch = async (query, size = 100) => {
    try{

        let batch = firestore().batch();

        //get documents
        let values = await query.get();
        if(values.size>0){
            values.foreach(value=> {
                batch.delete(value.ref);
            })

            //Delete the documents in bulk
            batch.commit();
            if(values.size>0){
                //Recusively call the function again to finish
                //deleting the rest of documents
                deleteInBatch(query,size);
            }
        }else{
            //exist function
            return;
        }
    }catch(err){
        throw err;
    }
}

答案 7 :(得分:0)

来自 v4.10.0 的版本 现在可以使用此方法批量删除。

await firestore.recursiveDelete(firestore.collection('foo'));

它使用 BulkWriter 来执行删除操作。