在云firestore中删除给出“doc.delete不是函数”

问题描述 投票:0回答:3

我想删除一个文档并从中删除特定的子集合。我正在使用网络客户端。如何检索子集合中的所有文档并将其删除?这是我现在拥有的:

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不是函数

javascript google-cloud-firestore
3个回答
4
投票

代码中的

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


0
投票

试试这个,我让你的代码使用 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()

0
投票

Google 建议您通过 CLI 调用在服务器端删除集合和子集合使用云函数。

而不是为您的云实现您自己的递归删除逻辑 功能上,可以利用 firestore:delete 命令 Firebase 命令行界面 (CLI)。您可以导入任何函数 使用以下命令将 Firebase CLI 添加到您的 Node.js 应用程序中 firebase-tools 包。

从 Cloud Firestore 删除数据

了解有关删除集合的一种推荐方法的更多信息 在生产中,请参阅删除集合和子集合

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.