首页 > 解决方案 > 无法从集合 firebase angular 中删除文档

问题描述

我更新了用于结构化的 Firestore 图像:

在此处输入图像描述 我使用这种方法删除了集合中的文档,但我没有收到错误,产品的 ID 仍然是正确的。

firebase.service.ts

  deleteProdusBayonete(id: string): Promise<void> {
    return (
      console.log(id),
      this.firestore
        .collection("bayonete")
        .doc<CutiteInterface>(`bayonete/bayonete/${id}`)
        .delete()
        .catch((error) => {
          console.log(error);
        })
    );
  }

删除-product.page.ts

 async deleteProdus(fID) {
    console.log(fID);
    const alert = await this.alertController.create({
      message: "Are you sure you want to delete this product?",
      buttons: [
        {
          text: "Cancel",
          role: "cancel",
          handler: (aha) => {
            console.log("Confirm Cancel: blah", aha);
          },
        },
        {
          text: "Okay",
          handler: () => {
            this.FirebaseService.deleteProdusBayonete(fID).then(() => {
              console.log(fID + " => Deleted");
            });
          },
        },
      ],
    });

    await alert.present();
  }

删除-product.page.html

  <ion-col class="arranged" size-lg="6" size-md="6" size-sm="6" size-xs="12"
        *ngFor="let bayoneta of this.ProduseService.allBayonet | async"
         [routerLink]="['/produse','angro', 'bayonete', bayoneta.id]">
...

  <ion-button type="submit" (click)="this.deleteProdus(bayoneta.id)">Sterge
                    Produs</ion-button>

** 更新:我修改了我的方法,所以我声明了另一个名为的参数,uniqueId,它是随机的生成器。但是..如果我无法达到通过 this.firestore.createId();功能添加产品时自动生成的documentId,我将无法达到此参数。

不过,我可以获取我的自定义参数,但无法使用我的方法来删除具有以下相同唯一 ID 的文档。**

  async deleted(uniqueID: string): Promise<any> {
    return await firebase
      .firestore()
      .collection("bayonete")
      .where("uniqueID", "==", `${uniqueID}`)
      .get()
      .then((res: any) => {
        console.log(uniqueID);
        firebase.firestore().collection("bayonete").doc(uniqueID).delete();
        console.log(uniqueID);
      })
      .catch((err: any) => {
        console.log(err);
      });
  }

我使用的创建产品方法是这样的:

createProdus(
    id: any,
    title: string,
    description: string,
    stoc: boolean,
    price: number,
    reducere: number,
    tag: string,
    image: string,
    userId: string,
    uniqueID: string
  ): Promise<void> {
    this.actualID = this.firestore.createId();
    this.firestore.collection("bayonete");
    return this.firestore.doc(`${id}/${this.actualID}`).set({
      id,
      title,
      description,
      stoc,
      price,
      reducere,
      tag,
      image,
      userId,
      uniqueID,
    });
  }

请有人帮忙..我真的找不到出路 在此处输入图像描述

标签: angulartypescriptfirebasegoogle-cloud-firestoreproduct

解决方案


问题在于,在您的 Firestore 上,documentId该字段不是您称为id. 为了做到这一点,您必须首先documentId通过查询 firestore 来发现 ,而在 AngularFire 中,您必须使用它snapshotchanges()来做到这一点。因此,您的删除功能代码可能如下所示:

deleteProdusBayonete(id: string): Promise<void> {
    return (
      console.log(id),
      this.firestore
          .collection('/bayonete', ref => ref.where('id', '==', ${id}))
          .snapshotChanges().pipe(
              map(actions => actions.map(a => {
                  const id = a.payload.doc.id;
                  return { id };
              })))
          .subscribe(documentId=> {
              this.firestore
                  .collection("bayonete")
                  .doc<CutiteInterface>(documentId)
                  .delete()
                  .catch((error) => {
                      console.log(error);
                  })
          });
    );
}

让我知道这个是否奏效。

注意:这是假设 的值id是唯一的。


推荐阅读