如何从 Firestore 获取子集合数据

Posted

技术标签:

【中文标题】如何从 Firestore 获取子集合数据【英文标题】:How to fetch sub-collection data from firestore 【发布时间】:2019-07-16 03:48:37 【问题描述】:

我有一个名为 TripInfo 的集合,后面跟着用户的 id,然后我为每个文档创建了带有自动生成 id 的子集合。问题是我无法使用以下代码获取数据:

private void checkDataExistingDate() 
    db.collection("TripsInfo").document(UID).collection("Individual_Trip").document()
            .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() 
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) 
            if (task.getResult().exists())
                DocumentSnapshot snapshot = task.getResult();

                Map<String, Object> map = snapshot.getData();
                for (Map.Entry<String, Object> entry : map.entrySet()) 

                        Log.d(Tag, "All data"+entry.getValue().toString());

                

            

        
    );

或者我需要存储没有子集合吗?在 Realtime 中,我们使用 push 来生成 auto-id,但是在这里我不知道在将用户的 id 放在文档中之后创建密钥的等价物是什么。

【问题讨论】:

请将您的数据库结构添加为屏幕截图并指明您想要获取的确切数据。 【参考方案1】:

假设您在 TripsInfo 集合中存储了带有 uid 参数的用户 ID,并且在“TripsInfo”集合中还有 Individual_Trip 作为子集合。你可以像这样获取子集合。

FirebaseFirestore.getInstance().collection("TripsInfo")
                .get()
                .addOnCompleteListener(
                        new OnCompleteListener<QuerySnapshot>() 
                            @Override
                            public void onComplete(@NonNull Task<QuerySnapshot> task) 
                                if (task.isSuccessful()) 
                                    for (QueryDocumentSnapshot document : task.getResult()) 
                                        if (FirebaseAuth.getInstance().getUid().equalsIgnoreCase(document.getString("uid"))) 
                                            document.getReference()
                                                    .collection("Individual_Trip")
                                                    .get()
                                                    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
                                                        @Override
                                                        public void onComplete(@NonNull Task<QuerySnapshot> task) 
                                                            list = task.getResult().toObjects(Individual_Trip.class);
                                                            showListOfRequest();
                                                        
                                                    )
                                                    .addOnFailureListener(new OnFailureListener() 
                                                        @Override
                                                        public void onFailure(@NonNull Exception e) 
                                                            hideProgress();
                                                        
                                                    );

                                            break;
                                        
                                    
                                
                            
                        );
FirebaseAuth.getInstance().getUid().equalsIgnoreCase(document.getString("uid"))

当您的“TripsInfo”集合中有多个数据时,此行用于检查用户 ID。

你也可以使用 whereEqualTo,FirebaseFirestore.getInstance().collection("TripsInfo") .whereEqualTo("userId", "uid").get()...

【讨论】:

以上是关于如何从 Firestore 获取子集合数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持访问权限不变的同时将 Firestore 文档从一个子集合共享到另一个子集合?

获取 Firestore 子集合

我如何在颤振中获得 Firestore 集合和子集合

如何在 Firebase + Firestore + Flutter 中使用 StreamBuilder 将所有子集合数据获取到 Widget

如何使用 Firebase Firestore 获取子集合? [复制]

来自特定文档 Firestore 安全性的通配符子集合