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

React Firestore 按文档ID数组批量查询文档返回空排查

问题原因

查询返回空结果是两处代码逻辑错误导致的:

  • 查询目标字段错误:当前代码where("docId", 'in', bookmarkIds)匹配的是文档内部存储的自定义docId字段,要匹配文档本身的ID(即doc.id对应的值),需要使用Firestore内置的documentId()关键字作为查询字段。
  • 传入查询的参数格式错误:获取用户书签ID时,直接执行bookmarkArray.push(doc.data().bookmarkIds),而bookmarkIds本身就是数组类型,push操作会将整个数组作为单个元素存入,最终传入查询的是二维数组(结构类似[['id1','id2']]),无法匹配到任何结果。
修复代码

首先从Firestore SDK导入需要的工具方法:

import { documentId } from "firebase/firestore";

修正后的业务逻辑代码:

const getData = (bookmarkIds) => {
  // 书签为空时直接清空数据,返回空函数占位
  if (!bookmarkIds?.length) {
    setPortfolioData([]);
    return () => {};
  }
  // Firestore in查询单次最多支持10个匹配值,超出需要分批查询
  const queryIds = bookmarkIds.slice(0, 10);
  // 修正查询字段:使用documentId()匹配文档ID
  const portfolioQuery = database.portfolioRef.where(documentId(), 'in', queryIds);
  const unsub = portfolioQuery.onSnapshot((snapshot) => {
    const tempItem = [];
    snapshot.docs.forEach((doc, idx) => {
      const data = doc.data();
      tempItem.push({
        id: idx + 1,
        intervieweeName: data.intervieweeName,
        intervieweeEmail: data.intervieweeEmail,
        projectTitle: data.projectTitle,
        portfolioTitle: data.portfolioTitle,
        dateCreated: data.dateCreated,
        fbId: doc.id
      })
    })
    setPortfolioData(tempItem);
  })
  return unsub;
}

useEffect(() => {
  // 存储作品集监听的解绑函数
  let portfolioUnsub = () => {};
  const getUserData = database.usersRef.where("email", "==", currentUser.email);
  const userUnsub = getUserData.onSnapshot((snapshot) => {
    // 解绑旧的作品集监听,避免重复触发
    portfolioUnsub();
    let bookmarkArray = [];
    snapshot.docs.forEach((doc) =>{
      const userBookmarks = doc.data().bookmarkIds || [];
      // 修正:展开数组合并,避免生成二维数组
      bookmarkArray.push(...userBookmarks);
    })
    // 对ID去重
    bookmarkArray = [...new Set(bookmarkArray)];
    portfolioUnsub = getData(bookmarkArray);
  })

  // 组件卸载时解绑所有监听
  return () => {
    userUnsub();
    portfolioUnsub();
  };
}, [currentUser.email]);
补充说明
  • 如果你的书签ID数量超过10个,需要将ID数组按每10个一组拆分,分别发起查询后再合并所有返回结果,否则超出部分的ID不会被匹配。
  • 如果你确认文档内部存储的docId字段和文档实际ID完全一致,也可以继续使用原字段查询,但必须保证传入的bookmarkIds是一维数组,不能嵌套。
  • 所有onSnapshot注册的实时监听都需要在不需要时主动解绑,否则会造成内存泄漏、重复回调的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:39:54