【问题标题】:Cloud FireStore: Retrieve 1 document with queryCloud FireStore:检索 1 个带有查询的文档
【发布时间】:2018-08-18 07:53:33
【问题描述】:

我正在尝试从集合中检索单个文档。我现在使用下面的代码返回一组项目,但我知道只有一个项目。所以它不是那么干净。

设置:

private db: AngularFirestore
private itemSubs: Subscription[] = [];
itemAd= new Subject<Item>();

fetchItemFromDatabase(itemId: string) {
    this.itemSubs.push(
      this.db.collection('items', id => id.where('itemId', '==', itemId)).valueChanges().subscribe((items: Item[]) => {
        this.itemAd.next(items);
      }));
  }

我试图用 this.db.collection('items').doc(itemId).get() 来做,但我在 get() 上收到一个错误,它没有找到/不支持。我在尝试调用此方法时也没有自动完成(在官方 cloud firestore 文档中找到的方法)。

我查看了其他一些解决方案,然后使用 this.db.collection('items').doc(itemId).ref.get().then(...) 进行了尝试,但在这里我得到了一个空文档。

所以我现在有点卡住了,当我知道里面只有 1 个项目时,我不想使用整个集合逻辑。

【问题讨论】:

    标签: javascript angular google-cloud-firestore


    【解决方案1】:

    可能有多个文档的itemId 等于给定值。虽然您可能知道您的应用程序中只有一个,但数据库和 API 无法知道也无法强制执行。因此,您运行的查询将始终返回可能包含多个文档的查询快照。

    this.db.collection('items', id => id.where('itemId', '==', itemId))
    

    如果您想强制只有一个文档具有给定的项目 ID,请考虑使用该项目 ID 作为文档名称,而不是将其作为字段存储在文档中。

    给定名称只能有一个文档,这意味着 ID 保证是唯一的。然后您可以使用以下命令检索该文档:

    this.db.collection('items').doc(itemId)
    

    【讨论】:

    • 谢谢。我已更改设置以使用唯一 ID。
    猜你喜欢
    • 2018-12-20
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2019-09-03
    • 2021-08-12
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多