【问题标题】:Is there a way to add a subcollection to a document whose document id is auto-generated-id?有没有办法将子集合添加到文档 ID 为自动生成 ID 的文档?
【发布时间】:2021-05-31 06:49:42
【问题描述】:

我正在尝试使用 Flutter 和 Firebase 创建一种社交网络应用程序。
如上图所示,'users' 集合中每个文档的文档 ID 都是自动生成的 ID,
FirebaseAuth 的“uid”存储在每个用户文档的“userId”字段中。
我想添加一个类似于twitter的关注功能的功能。

例如,如果文档 ID 为“4Fo5 ...”的用户关注文档 ID 为“0VkQ ...”的用户
想到的具体方法是
(a) 将“followees”子集合添加到document-id为“4Fo5”的用户的文档中,并将用户“0VkQ”的文档添加到其中,并将“0VkQ”的uid存储在文档中。
(b) 将“followers”子集合添加到文档ID为“0VkQ”的用户的文档中,并将用户“4Fo5”的文档添加到其中,并将“4Fo5”的uid存储到文档中。
(c) (a) 和 (b)。
(问题1)“是否有必要做(c)或(a)或(b)是否足够?”取决于我想在屏幕上显示什么?
或者我可以单独使用 (a)(或单独使用 (b))来完成此操作,而不管我要显示的信息类型如何?
如果可能的话,我想保持较低的firestore使用费,但是(a),(b)和(c)之间会有很大的区别吗?

所以我尝试了做,但是不知道如何在最开始显示的当前数据结构中添加子集合。

我可能需要这样的代码来添加子集合:

instance.collection('users')
            .document('4Fo5ovHE2N6NzDLzVyoC')
            .collection('followees')
            .document('0VkQnHRrjcr5u54oZ5hA').set({
          //...
        });

'4Fo5ovHE2N6NzDLzVyoC'
'0VkQnHRrjcr5u54oZ5hA'
但是为此我需要获取上面的自动生成的id,有没有办法在这个数据结构中获取自动生成的id?


(await instance.collection('users').where(
          'userId',
          isEqualTo: _auth.currentUser.uid,
        ).get()).docs[0].data()

通过上面的代码,我想我可以得到users集合中用户“4Fo5”对应的文档,
但我能得到的类型是 QueryDocumentSnapshot 类型,而不是 DocumentReference 类型。
所以从这里我认为我不能生成一个“followees”子集合。

(问题2)有什么办法吗?
如果没有办法做到这一点,则意味着我们无法将子集合添加到 document-id 为 auto-generated-id 的文档中,
所以如果我们想(或者如果我们必须)使用子集合,我们不应该使用自动生成的ID。对吗?

(问题3)作为替代方案,在用户“4Fo5”的文档的“followee”字段中

[
    "O66Ay3xEwxZSjdrMvTfYk9fypj02", //←"0VkQ"'s uid
    "TWxyYAy7caWnrfdBxjIOCVkzApi2", //←other followee's uid
]

上面在文档中存储列表的方法也想到了,
但是当我查看 firebase 文档等时,存储列表似乎有问题, 尤其是当关注者数量变多时。
还是不是好办法吗?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    我建议您使用用户 ID 作为文档 ID,因为您无法知道自动生成的 ID,而且这是一个额外的查询,尤其是当您想“保持较低的 Firestore 使用费”时,这是不必要的.

    关于为“followers”和“followee”添加子集合的问题,我会说两者都做。当您为每个功能都有特定的子集合时,它会更简单。

    我更喜欢将文档添加到子集合而不是将关注者/关注者存储在列表中,因为您可以轻松查询文档、检查它们是否存在并执行其他操作,而无需获取整个列表。

    【讨论】:

    • 感谢您的回复。使用 uid 作为 documenti-id 更直观,不是吗?但是,我认为这将是自动生成的 ID 的一个很大的缺点,但是是否存在使用自动生成的 ID 的情况?这是否意味着在存储没有 uid 或文件路径的不太重要的数据时使用自动生成的 ID?
    • 自动生成的 ID 适用于您没有文档的特殊/单独 ID 的情况 - 例如存储消息或书籍列表。在这种情况下,您可以使用自动生成的 ID 作为文档的 ID,如果您想使用它来识别它。
    • 另外,如果您查看firebase.google.com/docs/firestore/manage-data/add-data,您会发现没有提及不使用自动生成的 ID 作为劣势。开发人员可以选择让他们的工作更轻松的那个。
    【解决方案2】:

    没错,就是这样 FirebaseFirestore.instance.collection(id).collection(your_sub_collection).doc().set({}); 就是这样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2018-07-22
      • 2012-07-17
      • 2020-01-22
      相关资源
      最近更新 更多