【问题标题】:Can I get data from a document in a sub-collection from firebase using flutter if I don't know the document ID?如果我不知道文档 ID,我可以使用颤振从 firebase 的子集合中的文档中获取数据吗?
【发布时间】:2022-01-12 16:56:40
【问题描述】:

我有一个名为 users 的集合,在其中创建一个文档,在注册时,文档 ID 与 userID 相同(由云 Firestore 自动生成)

在用户的特定文档中,我创建了一个名为“addresses”的子集合。用户可以存储任意数量的地址,它们将作为单独的文档保存在此集合中。

在我的应用程序中,我可以添加一个新地址,然后将其与他/她添加的所有其他地址一起显示在一个列表中(这是通过阅读“地址”子集合中的每个文档来完成的)

注意:子集合中的每个新文档都有一个自动生成的 ID 分配给它。

我的问题是,有没有办法让我在不知道其 documentID 的情况下读取此子集合中的特定文档,如果是这样,我是否能够只编辑/删除这个特定文档。

(例如:用户 A 的文档有三个地址,它们都作为单独的文档存储在“地址”子集合中。用户 A 想从这三个文档中编辑/删除文档编号 2。我将如何让他查看并编辑/删除该文档)。

我对 Flutter 和 Firebase 非常陌生(两周前开始),所以如果我的问题没有意义,我很抱歉:3。

谢谢!

【问题讨论】:

  • 你的问题很简单,有几个解决方案,我需要你的代码来回答适当的答案。您能否分享您列出地址的代码,以便我能够回答您的问题?
  • "用户 A 想从这三个文档中编辑/删除文档编号 2" 您将需要了解有关文档编号 2 的唯一标识,例如它的文档 ID,您通常在您最初从数据库中读取文档。
  • 非常感谢你们的快速回复!昨天我弄乱了我的代码,让它的工作方式与@FrankvanPuffelen 在上面的评论中建议的方式相同。如果我有任何进一步的疑问,我一定会再次使用这个平台。谢谢!

标签: android firebase flutter dart google-cloud-firestore


【解决方案1】:

我弄乱了我的代码并在谷歌上搜索了一些解决方案,并找到了一种访问文档的方法。对于其他有相同疑问的人,我会尽可能简要地解释我所做的事情。

基本上,我没有引用文档 ID,因为它是在我通过颤振代码向文档添加数据时自动生成的:

if (_formKey.currentState!.validate()) {
     FirebaseFirestore.instance
        .collection('users')
        .doc(documentId)
        .collection('pickup_addresses')
        .doc()
        .add({
              'address': _addressController.text,
              'timestamp': DateTime.now().millisecondsSinceEpoch,
   });
}

正如@Frank van Puffelen 在上面的评论中所建议的那样,我需要能够唯一标识文档的东西,以便检索其数据。出于这个原因,我创建了一个 String 类型的变量,并在其中存储了一个唯一生成的文档 ID。然后我创建了一个具有相同 ID 的文档,并将其存储在这个新文档的一个字段中:

  String id = FirebaseFirestore.instance
      .collection('usres')
      .doc(documentId)
      .collection('pickup_addresses')
      .doc()
      .id;

  if (_formKey.currentState!.validate()) {
    FirebaseFirestore.instance
        .collection('users')
        .doc(documentId)
        .collection('pickup_addresses')
        .doc(id)
        .set({
             'address': _addressController.text,
             'timestamp': DateTime.now().millisecondsSinceEpoch,
             'docID': id
    });
  }

我知道这可能不是完美的解决方案,并且可能有更简单的方法来解决这个问题。如果是这样,我很想知道我能做些什么不同的事情。

我希望这个解决方案可以帮助那些在我所在的地方连续几个小时卡住的人!

谢谢!

【讨论】:

  • 请记住,所有这些都在我的代码中的 onPressed: () {}, 块中进行。
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2020-11-01
  • 1970-01-01
  • 2010-10-28
  • 2020-08-04
  • 2022-08-20
相关资源
最近更新 更多