【发布时间】:2023-03-24 18:19:01
【问题描述】:
我正在使用以下代码删除 Firestore 集合中的所有文档。我的问题是,如何执行一个函数,该函数将在带有已删除文档的数组中返回“deleteCollection”的结果(承诺)?我想遍历所有文档。我当然可以先查询所有数据,循环遍历它,然后执行这个函数,但是数据会被读取两次。
另一种选择是创建一个空的全局变量,删除函数在其中添加文档。但这有多安全?如果我要删除两个巨大的集合,则数组会填充两个不同的文档。那也不对。
我也尝试过修改'new Promise'返回,但是那个函数参数只能包含resolve或reject,不能包含数组。
所以我想要一个调用 deleteCollection 的函数,而不是我想要循环删除的数据。当我只想读取一次数据时,这可能吗?
function deleteCollection(db, collectionRef, batchSize) {
var query = collectionRef.limit(batchSize);
return new Promise(function(resolve, reject) {
deleteQueryBatch(db, query, batchSize, resolve, reject);
});
}
function deleteQueryBatch(db, query, batchSize, resolve, reject) {
query.get()
.then((snapshot) => {
if (snapshot.size == 0) {
return 0;
}
var batch = db.batch();
snapshot.docs.forEach(function(doc) {
batch.delete(doc.ref);
});
return batch.commit().then(function() {
return snapshot.size;
});
}).then(function(numDeleted) {
if (numDeleted <= batchSize) {
resolve();
return;
}
process.nextTick(function() {
deleteQueryBatch(db, query, batchSize, resolve, reject);
});
})
.catch(reject);
}
根据 Bergi 的回答编辑
const results = deleteCollection(db, db.collection("deleteme"), 1)
//Now I want to work with the results array,
//but the function is still deleting documents
function deleteCollection(db, collectionRef, batchSize) {
return deleteQueryBatch(db, collectionRef.limit(batchSize), batchSize, new Array());
}
async function deleteQueryBatch(db, query, batchSize, results) {
const snapshot = await query.get();
if (snapshot.size > 0) {
let batch = db.batch();
snapshot.docs.forEach(doc => {
results.push(doc); <-- the TypeError
batch.delete(doc.ref);
});
await batch.commit();
}
if (snapshot.size >= batchSize) {
return deleteQueryBatch(db, query, batchSize);
} else {
return results;
}
}
【问题讨论】:
-
@Bergi 我从 Google Docs 复制了代码:cloud.google.com/firestore/docs/manage-data/delete-data
-
哎哟。他们当然也应该避免它。在哪里可以使用文档提交错误?
-
@Bergi 我通过此链接与他们联系了几次:firebase.google.com/support/contact/bugs-features 他们通常会很快回复(约 1 天)。
-
我没有 Firebase 帐户,而且该联系页面需要一个人登录。
标签: javascript node.js firebase promise google-cloud-firestore