简体   繁体   中英

Firestore Update Sub-Collection Document

I would like to update a sub-collection document that I got by sending a group-query with Flutter. To my current understanding with a group-query I do not really know the parent of a sub-collection.

In order to do so, I need the document id of the parent document. The update query would then look like the following:

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

Is it necessary to save the parentDocumentId within the sub-collection document to be able to do such update or is there another way to do so?

If you want to update a document inside a subcollection, then you need both the top document id and the document id inside the subcollection.

Is it necessary to save the parentDocumentId within the sub-collection document to be able to do such update or is there another way to do so?

No, its not necessary, but if you have the parentDocumentId , and you dont have the subDocumentId , then you need to query to retrieve it:

    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"});
      });
    });

Unfortunately, I couldn't find an option to do this more cost-efficient. With this method, you have 1 read and 1 write operation.

Code for the following storage structure: 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); }

I case you have more documents in the subcollection you need to remove .limit(1) so you get all documents.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM