Firestore v9中如何基于屏蔽列表过滤帖子?
Firestore 屏蔽列表功能实现方案
当前代码的问题
你在where条件里传了一个文档引用(doc(...))给not-in,但not-in要求的是UID字符串数组,不是文档对象,这会直接导致查询报错。
正确实现步骤
1. 先获取当前用户的屏蔽列表数据
从block集合中,以当前用户UID为文档ID,取出blockedUserId数组:
import { getFirestore, doc, getDoc, collection, query, where, orderBy, getDocs } from "firebase/firestore"; const db = getFirestore(fireApp); // 替换成实际登录用户的UID const currentUserUid = "vXLCRjlhOVW6oFOJvtmML6OolKA2"; const blockDocRef = doc(db, "block", currentUserUid); // 获取屏蔽用户ID数组 const getBlockedUids = async () => { const blockDocSnap = await getDoc(blockDocRef); if (blockDocSnap.exists()) { // 确保返回的是数组,避免字段不存在的情况 return blockDocSnap.data().blockedUserId || []; } // 用户未屏蔽任何人时返回空数组 return []; };
2. 用屏蔽列表过滤帖子
拿到blockedUserId数组后,再构建帖子查询。注意:Firestore不允许not-in传空数组,所以要做长度判断:
const getFilteredPosts = async () => { const blockedUids = await getBlockedUids(); const postsRef = collection(db, "posts"); let postsQuery; if (blockedUids.length > 0) { // 有屏蔽用户时,过滤掉这些用户的帖子 postsQuery = query( postsRef, orderBy("uid"), where("uid", "not-in", blockedUids) ); } else { // 无屏蔽用户时,直接查询所有帖子 postsQuery = query(postsRef, orderBy("uid")); } // 执行查询并格式化结果 const querySnapshot = await getDocs(postsQuery); return querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); };
3. 注意事项
- 确保
block集合中文档的blockedUserId字段是字符串数组类型,和你的数据结构匹配 - Firestore的
not-in最多支持10个值,如果屏蔽用户超过10人,需要换方案:比如前端先拉取所有帖子再过滤(数据量大时不推荐),或者用Cloud Function做后台过滤,或者调整数据结构将屏蔽关系存在子集合中
内容的提问来源于stack exchange,提问作者Anteos1
相关产品推荐
相关产品推荐

