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
相关产品推荐
相关产品推荐

