有没有办法获取存储在 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-card
的 html 文件
<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 中的数组中对象的索引?的主要内容,如果未能解决你的问题,请参考以下文章