React JS中如何获取Firebase所有文档下子集合的全量订单数据


问题
请问我该如何从该数据库中获取所有订单数据?
我的数据存储代码如下:
db .collection('users') .doc(user?.email) .collection('orders') .doc(paymentIntent.id) .set({ basket: basket, amount: paymentIntent.amount, created: paymentIntent.created }) setSucceeded(true); setError(null); setProcessing(false);
解答
你当前的数据库结构是users根集合下以用户邮箱作为文档ID,每个用户文档下挂载orders子集合存储对应订单,下面分两种常见场景给出实现代码:
1. 获取单个指定用户的所有订单
如果你只需要拿当前登录用户的全部订单,直接读取对应用户下的orders集合即可:
import { getDocs, query, orderBy } from "firebase/firestore"; // 假设user是已登录的用户对象 const userOrdersRef = db.collection('users').doc(user.email).collection('orders'); // 可选:按创建时间倒序排列订单 const q = query(userOrdersRef, orderBy('created', 'desc')); const querySnapshot = await getDocs(q); const allOrders = []; querySnapshot.forEach((doc) => { allOrders.push({ orderId: doc.id, ...doc.data() }); }); // allOrders数组即为当前用户的所有订单数据
2. 获取平台全部用户的所有订单
如果你需要跨所有用户拉取全站所有订单,需要使用Firebase的集合组查询,使用前需要先在Firebase控制台为orders集合组创建对应的查询索引:
import { getDocs, query, orderBy, collectionGroup } from "firebase/firestore"; const allOrdersQuery = query(collectionGroup(db, 'orders'), orderBy('created', 'desc')); const querySnapshot = await getDocs(allOrdersQuery); const allPlatformOrders = []; querySnapshot.forEach((doc) => { allPlatformOrders.push({ orderId: doc.id, userEmail: doc.ref.parent.parent.id, // 可获取订单对应用户的邮箱 ...doc.data() }); }); // allPlatformOrders数组即为全站所有用户的订单数据
注意事项
- 使用集合组查询前必须按照Firebase控制台的提示创建对应索引,否则查询会报错
- 请确保你的Firebase安全规则已经开放了对应集合的读取权限,避免被权限拦截
内容的提问来源于stack exchange,提问作者Abhi Prajapati
相关产品推荐
相关产品推荐

