【问题标题】:Firestore: deleting multiple documents attempts to delete the same doc againFirestore:删除多个文档尝试再次删除同一个文档
【发布时间】:2020-07-26 20:28:58
【问题描述】:

我正在设置一个函数来根据文档中的属性删除多个 Firestore 文档。它确实有效,但是当它执行时,它可能会尝试两次删除同一个文档(添加了控制台日志语句进行验证)。方法如下:

   async deleteDocuments<T>(collectionName: string, fieldToCheck: string, stringValueToCheck: string) {
      // Get a collection based on the field being checked and then set a property for document ID to 'id'
      this._afs.collection(collectionName)
         .ref.where(fieldToCheck, '==', stringValueToCheck)
         .onSnapshot(async x => {
            if (x) {
               x.forEach(async doc => {
                  try {
                     console.log(`deleting: ${collectionName}/${doc.id}`)
                     await doc.ref.delete();
                  } catch (error) {
                     console.log(error)
                  }
               })
            }
         })
   }

虽然它不会在所有文档上重复尝试,这确实令人困惑。例如,我有三个文档,当我运行它时,它迭代了两个文档两次,一个文档一次。我在另一组包含十几个左右的文档上进行了尝试,看起来它具有相同的结果(尽管我对 1:3 的比例并不肯定)。

【问题讨论】:

  • 我建议您编辑您的问题,以显示它始终如您所愿运行的情况的具体细节。您的帖子中应该有足够的信息,以便任何人都可以复制它。如果您说它是随机发生的,那么这实际上并没有足够有用的信息来处理。

标签: angular google-cloud-firestore angularfire


【解决方案1】:

您正在订阅某个查询,当然,当您删除一个或多个元素时,结果会发生变化。我修复了您的代码,因此您只需将其删除一次即可,而不是订阅。

async deleteDocuments<T>(collectionName: string, fieldToCheck: string, stringValueToCheck: string) {document ID to 'id'
      const docs = await this._afs.collection(collectionName)
         .ref.where(fieldToCheck, '==', stringValueToCheck)
         .get();
      docs.forEach(doc => doc.ref.delete());
   }

【讨论】:

  • 谢谢安德烈,就是这样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多