我想删除一个文档并从中删除特定的子集合。我正在使用网络客户端。如何检索子集合中的所有文档并将其删除?这是我现在拥有的:
let id = e.target.parentElement.getAttribute('data-id');
if (accountType == 'admin') {
if(confirm("Are you sure you want to delete this event?")) {
db.collection('campouts').doc(docIdDoc).collection('attending').get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
doc.delete();
});
});
db.collection('campouts').doc(id).delete().then(() => {
});
当我单击按钮时,我在控制台中收到此错误:
script.js:123未捕获(承诺中)TypeError:doc.delete不是函数
代码中的
doc
是 QueryDocumentSnapshot
,它是文档数据的内存快照。要删除文档,您需要一个 DocumentReference
,您可以从快照的 ref
属性中获取它。
所以:
db.collection('campouts').doc(docIdDoc).collection('attending').get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
doc.ref.delete();
});
});
对于此类问题,我强烈建议您将参考文档放在手边。您可以沿着路线从
Query.get
-> QuerySnapshot
-> QueryDocumentSnapshot
-> DocumentSnapshot
-> ref
-> DocumentReference
。
试试这个,我让你的代码使用 async/await,因为承诺链对我来说很混乱。
const mainFunction = async () => {
const refs = await db
.collection('campouts')
.doc(docIdDoc)
.collection('attending')
.get()
await Promise.all(
refs.map(async (doc) => {
await doc.ref.delete()
}),
)
}
mainFunction()
Google 建议您通过 CLI 调用在服务器端删除集合和子集合使用云函数。
而不是为您的云实现您自己的递归删除逻辑 功能上,可以利用 firestore:delete 命令 Firebase 命令行界面 (CLI)。您可以导入任何函数 使用以下命令将 Firebase CLI 添加到您的 Node.js 应用程序中 firebase-tools 包。
了解有关删除集合的一种推荐方法的更多信息 在生产中,请参阅删除集合和子集合。