React Native 中使用 Firebase Firestore 拉取所有用户发布帖子的实现问题
解决方案
你需要使用 Firestore 的集合组查询(Collection Group Query) 实现需求,Firestore 不支持直接在路径中写*通配符匹配子集合,集合组查询专门用于匹配所有层级下同名的子集合,刚好适配你拉取所有用户userPosts下全部帖子的场景。
前置操作
第一次运行查询前需要配置userPosts的集合组查询索引:运行代码后控制台会抛出错误,错误信息中会直接提供索引创建链接,点击跳转后一键创建即可,无需手动配置参数。
修正后的代码
你只需要修改 collection 调用行即可,完整代码如下:
const fetchPosts = async () => { try { const list = []; await db // 替换为集合组查询,匹配所有名为 userPosts 的集合 .collectionGroup('userPosts') .get() .then((querySnapshot) => { // console.log('Total Posts: ', querySnapshot.size); querySnapshot.forEach((doc) => { const { userId, post, postImg, likes, comments } = doc.data(); list.push({ id: doc.id, userId, userName: "Test Name", userImg: "https://lh5.googleusercontent.com/-b0PKyNuQv5s/AAAAAAAAAAI/AAAAAAAAAAA/AMZuuclxAM4M1SCBGAO7Rp-QP6zgBEUkOQ/s96-c/photo.jpg", post, postImg, liked: false, likes, comments, }); }); }); setPosts(list); if (loading) { setLoading(false); } console.log("Posts: ", posts); } catch (e) { console.log(e); } }; useEffect(() => { fetchPosts(); }, []);
额外说明
- 集合组查询的过滤、排序逻辑和普通集合查询完全一致,后续需要筛选特定条件的帖子时,直接链式调用
where、orderBy等方法即可。 - 如果你项目中还有其他路径下也存在名为
userPosts的集合,可以在查询中加入路径相关的过滤条件做区分,你当前的结构下只有posts/{UserUID}/userPosts匹配集合名,不需要额外处理。
内容的提问来源于stack exchange,提问作者Arnav Singh
相关产品推荐
相关产品推荐

