代码之家  ›  专栏  ›  技术社区  ›  Zibal

FirebaseError:集合引用无效。集合引用的段数必须为奇数

  •  1
  • Zibal  · 技术社区  · 2 年前

    我正试图用这个函数从Firestore获取所有事件:

    import { db } from "../firebase";
    import { collection, query, getDocs, where } from "firebase/firestore";
    import getCurrentUser from "./CurrentUser";
    
    const getEvents = async () => {
      const uid = getCurrentUser().uid;
    
      const eventsRef = collection(db, "events", uid);
      const que = query(eventsRef, where("creator", "==", uid));
    
      const result = await getDocs(que);
    
      return result;
    };
    
    export default getEvents;
    

    我得到错误: FirebaseError:无效的集合引用。集合引用必须有奇数个段,但events/98HobTnfjndUE1jIBQpKYCeN4hl2有2个

    以下是数据库的规则:

    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
        match /events/{userId} {
          allow read, update, delete: if request.auth != null && request.auth.uid == userId;
          allow create: if request.auth != null;
        }
      }
    }
    

    我做错了什么?我从中找到了这些规则 https://firebase.google.com/docs/firestore/security/rules-conditions 。如果我删除request.auth.uid==userId,它可以工作,但我想保留它。那么我该如何使此功能工作呢?谢谢

    1 回复  |  直到 2 年前
        1
  •  2
  •   Piyush Patil    2 年前

    您看到的错误消息是因为Firestore在指定文档或集合时需要奇数个路径段。在Firestore中,路径在集合和文档之间交替。例如:

    • events 是一个集合
    • events/<some-id> 是中的文档 事件 收集
    • events/<some-id>/subcollection 是该文档下的子集合

    您当前正试图在中的文档下获取子集合 事件 以UID作为子集合名称的集合:

    const eventsRef = collection(db, "events", uid);
    

    但是,根据您的Firestore规则和遇到的错误,您似乎正在尝试获取具有UID的文档,而不是子集合。

    以下是修复代码的方法:

    1. 修改Firestore引用

    更改您的 getEvents 函数获取具有UID的文档:

    const getEvents = async () => {
      const uid = getCurrentUser().uid;
      const eventDocRef = doc(db, "events", uid);
      
      const result = await getDoc(eventDocRef);
      
      return result;
    };
    
    1. 检查Firestore数据结构

    确保您的Firestore数据库结构与您试图查询的内容相匹配。如果在 事件 集合,则上述更改应该有效。但是,如果您打算在每个用户文档下都有一个子集合,那么您的数据库结构将需要一个修订来匹配您的查询逻辑。

    1. Firestore规则

    您的规则似乎集中在 事件 收集确保每个用户的数据都存储为文档,其UID作为中的文档ID 事件 收集