有没有办法获取存储在 firestore 中的数组中对象的索引?

Posted

技术标签:

【中文标题】有没有办法获取存储在 firestore 中的数组中对象的索引?【英文标题】:Is there a way to get the index of an object in an array stored in firestore? 【发布时间】:2021-01-12 10:07:00 【问题描述】:

我正在使用 Ionic 和 firebase firestore。我希望能够单击某个包含对象的ion-card 并调用一个方法,该方法会弹出一个包含 Delete 按钮的ion-action-sheet,我可以在其中删除特定对象。此对象存储在 firestore 的数组中。

这是数据结构的样子:

这是我当前用于ion-cardhtml 文件

<ion-card class="lightCard" *ngFor="let reviews of revArr" (click)="selectReview()">

        <ion-card-header>
          <ion-grid>
            <ion-row>
              <ion-icon name="person-circle-sharp" class="profIcon"></ion-icon>
              <!-- <ion-card-subtitle>Card Subtitle</ion-card-subtitle> -->
              <ion-card-title class="cardUsername fontWhite" style="font-size: 35px;">reviews.userName</ion-card-title>
            </ion-row>
          </ion-grid>
          
        </ion-card-header>
          
        <ion-card-content class="font cardContent">
          <h1 class="title" style="font-weight: bold;">reviews.title</h1>
          reviews.review
        </ion-card-content>
      
      </ion-card>

这是类内的代码:

  ngOnInit() 
    const compId: string = this.route.snapshot.paramMap.get('id'); //get id

     //for reviews array in `reviews`
    this.reviewCollection = this.afStore.doc(`reviews/$compId`)
    this.rev = this.reviewCollection.valueChanges().subscribe(item =>
    this.revArr = item.reviews
    this.userNrev = item.reviews.userName
     )   
  

  async selectReview()
  
    const actionSheet = await this.actionSheetCtrl.create(
      header: "Delete "+ this.userNrev + "'s review?",
      buttons: [
        
          text: 'Delete',
          handler: () => 
           //delete code
          
        
      ]
    )
    await actionSheet.present();
  

真正的问题是:如何从 firestore 中的数组中获取索引并使用该索引删除对象?

如果有人可以帮助我,那就太好了,我对此还是很陌生。

【问题讨论】:

【参考方案1】:

Firebase 不建议为此使用数组,因为多人同时更新数组时很容易损坏数据。

您还应该考虑到 Firebase 文档的最大大小为 1mb。所以如果你有很多长评论,你就会达到这个限制,而且总是会加载那个巨大的文件。

在您的情况下,您可能需要更改代码中的数组并更新整个字段。

更好的解决方案子集合,其中每条评论都是一个文档。然后一次获取 25 个(使用 limit())

现在您可以非常轻松地更新/删除每条评论。

Here is a Link 转至官方 YouTube 系列,他们将在其中解释 Firestore 以及如何构建它。

【讨论】:

感谢您的创意!我将使用子集合 “Firebase 不建议使用数组”是对 Firestore 的过于简单化的建议。数组有特定的用途,以及用于操作和查询的几个 API。事务帮助代码修改数组而不会发生争用。它们有目的,但并不是所有问题的解决方案。 @DougStevenson 没错,我也在 Firestore 中使用数组。我的意思是不推荐用于该用例。【参考方案2】:

您的方法对于您想要实现的目标实际上是错误的:

如果您只想存储一些随机的数据列表,您完全可以在单个文档中使用一个数组,然后将您想要的任何数据放入其中。 但是,一旦您想要存储以后要操作的数据(删除、更新...),您就必须将每个条目存储在它自己的文档中,即一个评论 -> 一个文档。这样可以更轻松、更可靠地更新或删除单个评论甚至是一组评论。

如果您对正确使用 Firestore 感兴趣,可以观看此视频link,其中使用了 Angular,所以我认为它会帮助您走得更远。

【讨论】:

感谢您的回复!我将使用子集合进行评论,这样我就可以对您提到的一份文档进行一篇评论

以上是关于有没有办法获取存储在 firestore 中的数组中对象的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firestore 获取数组?

有没有办法用数组构造一个 Firestore 字段(同名)并显示 TableView 中每个字段的每个数组元素

如何在 firestore 中的现有数组中添加或删除项目?

从 id 数组中获取 firestore 文档列表

有啥方法可以从 Firestore 中的数组更新特定索引

从Firestore获取一个ArrayList并从该列表中选择3个随机字符串