如何使用onSnapshot和setOrders在Firebase中查询2个集合?

qxgroojn  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(118)

我目前正在使用Firebase,特别是第一次使用Firestore,我遇到了一个错误,阻止了我的进度。我有一个文档有2个嵌套集合,我试图通过它们进行查询,并按降序排列。然后使用Firestore快照功能,我试图Map文档并捕获任何更改。我知道Firebase的语法已经改变,当我在本地主机上运行代码时,我得到了这个错误:
无效的文档引用。文档引用必须具有偶数个段,但users/JAVTmLaWdWOTpXH 5iPw 25 E2 CF 7z 2/orders具有3个段。
我在调试时尝试了不同的方法,比如为“用户”和“订单”创建两个不同的文档,但没有成功。下面我将附上代码,一直给我这些错误,我想知道如果有人会知道如何正确使用新的Firestore语法。如有任何帮助或建议,我们将不胜感激。

import React, { useEffect, useState } from "react";
import "./Orders.css";
import { useStateValue } from "./StateProvider";
import { db } from "./firebase";
import { doc, 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) {
      const orderRef = doc(db, "users", user?.uid, "orders");
      const q = query(orderRef, 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”创建一个文档,然后添加到该文档中,以便在该文档中包含名为“orders”的集合。
预期的结果是,我收到没有错误,并可以正确的顺序降序。

cngwdvgl

cngwdvgl1#

代码中的错误来自这一行:

const orderRef = doc(db, "users", user?.uid, "orders");

这一行中的路径(users/JAVTmLaWdWOTpXH5iPw25E2CF7z2/orders)指向一个集合,而不是该集合中的特定文档。因此,要创建对该集合的引用,需要使用用途:

const orderRef = collection(db, "users", user?.uid, "orders");

我有一个文档有2个嵌套集合,我试图通过它们查询.
Firestore一次只能查询一个集合,或者使用一个特定名称跨所有集合查询。目前不支持在多个具有不同名称的集合之间进行查询。

相关问题