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

Firestore中使用onSnapshot和排序查询嵌套集合报错求助

解决Firestore "Invalid document reference" 错误

问题根源

你错误地使用了doc()方法来引用集合,而doc()仅用于创建文档引用。Firestore要求文档引用的路径段数为偶数(格式:集合/文档/集合/文档),但users/{uid}/orders是3段,属于集合路径,因此触发错误。

修正后的代码

首先需要导入collection方法,然后将集合引用的创建方式从doc()改为collection():

import React, { useEffect, useState } from "react";
import "./Orders.css";
import { useStateValue } from "./StateProvider";
import { db } from "./firebase";
// 新增导入collection方法
import { collection, onSnapshot, orderBy, query, setDoc } from "firebase/firestore";
import Order from "./Order";

function Orders() {
  const [{ basket, user }, dispatch] = useStateValue();
  const [orders, setOrders] = useState([]);

  useEffect(() => {
    if (user) {
      // 用collection替代doc,获取用户的orders集合引用
      const orderCollectionRef = collection(db, "users", user?.uid, "orders");
      const q = query(orderCollectionRef, orderBy("created", "desc"));
      onSnapshot(q, (snapshot) => {
        setOrders(
          snapshot.docs.map((doc) => ({
            id: doc.id,
            data: doc.data(),
          }))
        );
      });
    } else {
      setOrders([]);
    }
  }, [user]);

  return (
    <div className="orders">
      <h1>Your Orders</h1>

      <div className="orders__order">
        {orders?.map((order) => (
          <Order order={order} />
        ))}
      </div>
    </div>
  );
}

export default Orders;

关键说明

  • 集合与文档的路径规则:
    • 文档引用:路径段数必须为偶数(例如users/{uid}是2段,代表一个用户文档)
    • 集合引用:路径段数为奇数(例如users/{uid}/orders是3段,代表用户下的订单集合)
  • collection()方法用于创建集合引用,后续可以基于它构建查询、监听快照
  • 确保你的Firestore数据库结构正确:users集合 → 单个用户文档 → orders嵌套集合 → 单个订单文档,每个订单文档包含created字段用于排序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:55:19