如何从文档中检索未知子集合

时间:2020-07-02 15:15:53

标签: firebase flutter google-cloud-firestore

我有以下代码,旨在像这样撤消所有文档:Collection('A').document(currentUser),这应该给我文档YRZ1 ****,就像您在第一张图片中看到的那样。现在,我要做的就是获取t22o9 ***子集合中的所有文档,如第二幅图像所示,我该怎么做?

var docPath=Firestore.instance.document('Messages/$currentUser');

docPath.snapshots().listen((event) {
  print('Hello  12 ${event.data}');

});

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

为了从子集合中获取数据,您可以执行以下操作:

var db = Firestore.instance;
//This is a reference to the YRZ1**** doc
var messagesDoc = db.collection('Messages').document('Messages/$currentUser');
//collectionId is the t22o9*** id, you need to have this set previosly in your code
var docList = [];
messagesDoc.collection(collectionId)
           .getDocuments()
           .then((QuerySnapshot snapshot) {
               snapshot.documents.forEach((doc) => docList.add(doc)'));
           });

使用此代码,docList将是位于YRZ1 ***文档的子集合t22o9 ***中的文档的列表。

您还可以通过一些示例来检查此link,该示例如何使用flutter从Firestore中获取数据。

编辑

根据您对注释的澄清,使用动态创建的子集合来获取子集合数据要稍微复杂一点,正如您在此link上看到的那样,我认为情况就是如此。在您的情况下,最可行的解决方案是在父文档中创建子集合的ID列表,例如,您的YRZ1 ***文档将具有此结构

document
   id: YRZ1***
   subCollectionIds : [subCollectionId1, subCollectionId2,...]
   subCollection1
   subCollection2
   ...
   subCollectionN

具有这种结构,您可以使用此代码来检索子集合的列表以及每个子集合的第一个文档,并根据您想要的任何字段进行排序:

var db = Firestore.instance;
var listFirstDocSub = []
//This is a reference to the YRZ1**** doc
db.collection('Messages')
  .document('Messages/$currentUser')
  .getDocument()
  .then((DocumentSnapshot doc) {
      var listSubCollections = doc["subCollectionIds"];
      listSubCollections.forEach((id) {
          db.collection('Messages')
            .document('Messages/$currentUser')
            .collection(id)
            .orderBy("WHATEVER_FIELD_YOU_DECIDE")
            .limit(1)
            .getDocuments()
            .then((DocumentSnapshot snapshot) {
                listFirstDocSub.add(snapshot);
            }) 
      });
});

注意:使用这种方法,每次添加新的子集合时,还需要将其ID添加到subCollectionIds列表中。

希望如此。