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

如何在Firestore Web模块化API中获取用户公开数据并适配安全规则

问题与解决过程

原配置

我的Firestore用户数据库结构分为users/{userID}/public和users/{userID}/private/**层级,配置的安全规则如下:

match /users/{userID} {
  match /public {
    allow read: if request.auth != null;
  }
  match /private/{document=**} {
    allow read: if request.auth.uid == userID;
  }
}

遇到的问题

我需要仅获取用户的公开数据而非全部数据,但使用Firebase Web Modular API时遇到阻碍:旧版本API的.select()字段筛选函数不兼容当前模块化API,且ChatGPT生成的尝试代码无法正常运行,代码如下:

export const getUserFromHashedUID = async (hashedUID, fields) => {
  const db = getFirestore();

  // const userDocRef = doc(collection(db, 'users', hashedUID), 'public');
  const userPublicCollectionRef = collection(db, 'users', hashedUID, 'public');
  const userDocRef = doc(userPublicCollectionRef, 'public');
  
  try {
    const docSnapshot = await getDoc(userDocRef);
    
    if (docSnapshot.exists()) {
      const publicData = fields.reduce((acc, field) => {
        acc[field] = docSnapshot.get(field);
        return acc;
      }, {});

      console.log(publicData);
    } else {
      console.log('No such document!');
    }
  } catch (error) {
    console.error('Error getting document:', error);
  }
};

注:这段代码对public路径的引用逻辑有误,导致无法正确定位到目标文档。

最终解决方案:调整数据库结构

我将数据库结构调整为直接在users集合下创建{userID}-public和{userID}-private文档,结构示例如下:

users:{
  "1234567-private":{"data":"data"},
  "1234567-public":{"data":"data"},
  "9876543-private":{"data":"data"},
  "9876543-public":{"data":"data"},
}

该结构在数据读取效率上与原结构持平,且能完美适配安全规则——只需修改规则,让{userID}-public允许任意已认证用户读取,{userID}-private仅对应用户UID可读取即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:14:52