Ionic 4 Firestore 是否可以只读取文档的一部分?

分享于2023年03月15日 angular google-cloud-firestore ionic4 问答
【问题标题】:Ionic 4 Firestore is it possible to read only a part of a document?Ionic 4 Firestore 是否可以只读取文档的一部分?
【发布时间】:2020-05-18 06:24:40
【问题描述】:

希望你没事!感谢阅读。

编辑了问题。

假设firestore中的一个文档有如下存储的对象:

someida: {name: steve, alias: cap, etc}
someidb: {name: tony, alias: iron, etc}
someidc: {name: nat, alias: black, etc}
someidetc

而且我知道所有的“某些人”,我猜答案可能是否定的,但是

是否可以编写一个只读取其中一个 someid 中的内容的查询?

目前我可以获得我需要的数据,但是在阅读了所有文档和编码后找到它,并且想知道是否有可能避免这种情况,并且只读取一个对象的内容,因为我有“someid”。

已经发布了很好的回复,只是想知道是否还有其他建议。

提前非常感谢! 最好的!


【解决方案1】:

最简单的方法是稍微重构一下您的文档。与其将每个“someid”存储为一个属性,不如在 Firestore 文档中创建一个映射数组作为单个属性。例如,您的文档如下所示:

ids: [
      {id: someida, name: steve, alias: cap, etc},
      {id: someidb, name: tony, alias: iron, etc},
      {id: someidc, name: nat, alias: black, etc}
]

其中 id name alias 是对象的属性, ids 是对象的数组该对象的类型。

现在,您可以轻松地从应用中的该数组中提取所需的数据。由于您可能正在使用 AngularFire,您可以通过在 ngOnInit 中调用以下 API 来检索此文档:

ngOnInit() {
  this.users = await this.angularFirestore.collection(YOUR_COLLECTION).doc(YOUR_DOCUMENT).get()
    .pipe(map(result => result.data().ids as Array))
    .toPromise();
}

getAlias(requestedId: string) {
  return this.users.find(ob => ob.id === requestedId).alias;
}

isUserAvailable(requestedId: string): boolean {
  return !!this.users.find(ob => ob.id === requestedId);
}

要获取“someidc”的 别名 ,可以调用以下函数: this.getAlias("someidc")

并找出某个 id 是否可用: this.isUserAvailable("someida")

当然,请务必在调用 Firestore 后调用这些函数。 ngOnInit 应该会为您解决这个问题。

【讨论】:

  • 谢谢@HaniBhat!你的回复很棒而且非常有用,我相信我的问题没有正确表达,但你明白了,然后,只是为了正确地问,我的文档现在的结构方式,真的没有办法写一个查询和只提取一个 someid{} 中的内容?我觉得我可以按照您的建议重组文档,仍然是现在我得到结果的方式,但是代码更复杂和纠结,然后我想我会将问题的标题更改为“是否可以只读文件的一部分?”,非常感谢!
  • 我想我自己弄糊涂了,我相信我可以使用 rxjs 得到我想要的东西,谢谢!
  • @Chucho7 是的,您还可以使用 rxjs map 运算符仅检索所需的文档部分。我也很确定没有办法使用您现在拥有的相同文档结构来获得您想要的东西。