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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:36