You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Cloud Firestore:偶数段路径集合获取失败,求助分类获取方法

解决Firestore获取分类列表的问题

咱们先拆解下你遇到的两个问题,再给出针对性的解决办法:

第一个报错的原因

你第一次用firestore.collection("shop/warehouse")触发错误,是因为Firestore对集合引用的路径有严格要求:集合路径的段数必须是奇数。而shop/warehouse是两段(shop是根集合,warehouse是该集合下的文档),属于文档引用,不是集合,所以不能用collection()方法调用。

第二个代码拿不到数据的原因

你改成firestore.collection("shop/").document("warehouse")后,读取的是warehouse这个文档本身的数据,但你的分类(cat1、cat2)是存在warehouse文档的**子集合categories**里,不是warehouse文档的字段,所以documentSnapshot.getData()返回空——你读错了对象,应该读子集合而非文档。

正确的实现代码

根据你描述的结构Shop > warehouse > categories > cat1、cat2,正确的做法是访问warehouse文档下的categories子集合,对应的集合路径是shop/warehouse/categories(三段,奇数,符合集合引用要求)。

下面是可以正常获取分类列表的代码:

firestore.collection("shop/warehouse/categories")
    .addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, 
                           @Nullable FirebaseFirestoreException e) {
            // 先处理异常情况
            if (e != null) {
                Log.d(TAG, "监听分类列表出错: " + e.getMessage());
                return;
            }
            
            // 遍历分类集合里的文档
            if (queryDocumentSnapshots != null && !queryDocumentSnapshots.isEmpty()) {
                for (DocumentSnapshot doc : queryDocumentSnapshots) {
                    // doc.getId()就是你要的分类名称(cat1、cat2)
                    String categoryName = doc.getId();
                    Log.d("获取到的分类", categoryName);
                    
                    // 如果需要获取分类对应的文档内容,可调用doc.getData()
                    Map<String, Object> categoryContent = doc.getData();
                    if (categoryContent != null) {
                        Log.d("分类对应文档数据", categoryContent.toString());
                    }
                }
            } else {
                Log.d(TAG, "未找到任何分类数据");
            }
        }
    });

额外确认点

请你在Firebase控制台核对数据结构是否和预期一致:

  • shop是根级集合
  • warehouse是shop集合中的文档(不是集合)
  • categories是warehouse文档的子集合
  • cat1、cat2是categories集合中的文档

如果你的实际结构和上述不符(比如warehouse是集合而非文档),可以根据调整后的路径修改代码,但按照你描述的“每个分类包含名称及对应文档”,上面的代码应该完全匹配你的需求。

内容的提问来源于stack exchange,提问作者Sabatino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:45:49