【问题标题】:Firestore Update Sub-Collection DocumentFirestore 更新子集合文档
【发布时间】:2020-08-25 21:33:11
【问题描述】:

我想更新我通过使用 Flutter 发送 group-query 获得的子集合文档。据我目前对 group-query 的理解,我并不真正了解子集合的父级。

为此,我需要父文档的文档 ID。更新查询将如下所示:

collection(collectionName)
.document(parentDocumentId)
 .collection(subCollectionName)
  .document(subCollectionDocumentId)
   .updateData(someMapWithData);

是否有必要将 parentDocumentId 保存在子集合文档中才能进行此类更新,还是有其他方法可以做到这一点?

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    如果要更新子集合中的文档,则需要顶部文档 id 和子集合中的文档 id。

    是否有必要将 parentDocumentId 保存在子集合文档中才能进行此类更新,还是有其他方法可以做到这一点?

    不,没有必要,但如果你有parentDocumentId,而你没有subDocumentId,那么你需要查询来检索它:

        Firestore.instance
            .collection("path")
            .document("docPath")
            .collection("subCollection")
            .where("name", isEqualTo: "john")
            .getDocuments()
            .then((res) {
          res.documents.forEach((result) {
            Firestore.instance
                .collection("path")
                .document("docPath")
                .collection("subCollection")
                .document(result.documentID)
                .updateData({"name": "martin"});
          });
        });
    

    【讨论】:

    • 我明白了。尽管将其与您的建议进行比较,但将 parentId 保存在子集合的文档中会不那么麻烦,也可能更具成本效益?
    • 在 Firestore 中,您可能拥有集合 -> 文档,并且在文档内部,您可以拥有一个包含多个文档的子集合。多个文档不能具有相同的文档 ID。所以最后,您将不得不执行查询才能更新数据。如果您在这多个文档中将 parentId 保存为字段(pID : parentId),那么您将需要执行示例中的查询
    • 在您的查询中,您正在进行搜索,因此当我将 parentId 保存在子集合的文档中时,这将没有必要,因为我可以执行以下查询: Firestore.instance.collection( 'path').document(parentId).collection('subCollection').document(documentId).updateData(...);
    • 在我的查询中,我正在子集合中进行搜索,我已经拥有它的 parentid。但正如我所说,每个文件都必须有一个唯一的 ID。在子集合中,您将拥有多个具有唯一文档 ID 的文档,在我的查询中,我正在搜索子集合中的文档 ID。你打算如何得到这个document(documentid)?如果我对您的理解正确,您是说您将添加 parentdocumentid 作为子文档的文档 ID。但是,如果您在子集合中有多个文档,它们必须具有唯一的文档 ID
    • 是的,这部分每个文档都有自己的 id 对我来说很清楚。此时,我有了在子集合中找到的文档的 id。我的问题是关于从下到上的搜索,以获取父文档的 id。所以我认为最好的方法是将父母的 Id 作为一个字段传递给它的所有“孩子”。
    【解决方案2】:

    很遗憾,我找不到更经济高效的方法。使用此方法,您可以进行 1 次读取和 1 次写入操作。

    以下存储结构的代码:users/${uid}/collection/$documentName/

    static Future updateSubData(String uid, String mainCollection,
      String subCollection, Map<String, dynamic> json) async {
    //get document ID
    final querySnapshot = await fireStoreInstance
        .collection(mainCollection)
        .doc(uid)
        .collection(subCollection)
        .limit(1)
        .get();
    //document at position 0
    final documentId = querySnapshot.docs[0].id;
    //update this document
    await fireStoreInstance
        .collection(mainCollection)
        .doc(uid)
        .collection(subCollection)
        .doc(documentId)
        .update(json);
      }

    如果您在子集合中有更多文档,您需要删除 .limit(1),以便获得所有文档。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2018-12-31
      • 2018-10-21
      • 2020-12-29
      • 2022-01-07
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      相关资源
      最近更新 更多