我正在寻找一种清除整个系列的方法。我看到有一个批量更新选项,但这需要我知道集合中的所有文档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)
}
}
}
答案 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可以一次性删除整个集合(或其内容)。
要删除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
来执行删除操作。