首页 > 解决方案 > 我可以从 Firestore 中以对象形式在 React 中检索数据及其嵌套数据吗?

问题描述

问题:我想检索 JhonDoe 中的所有集合及其嵌套集合和/或对象或对象数组格式的文档。

Firestore 中的数据库:

--- members (collection)
         |
         --- JhonDoe (documents)
              |
              --- May (collection)
                    |
                    --- 28 (documents)
                          |
                          --- expense: "1"
                          |
                          --- gain: "2"
                          |
                          --- name: "Jhon Doe"

我想要一个对象或对象数组,例如:

{
   May: {
         28: {
                 expense: '1',
                 gain: '2',
                 name: 'Jhon Doe'
             }        
         },
  //June: { } 
 }

我试过的:

export const getMembersDailyGains = async (name) => {
  const dbName = name.replace(/\s/g, "");
  const gainsList = [];
  try {
    db.collection(`members/${dbName}`).get.then((snapshot) => {
      snapshot.docs.forEach((doc) => {
        gainsList.push(doc.data());
        console.log(gainsList);  //error logged is below
      });
    });
  } catch (error) {
    console.log(error);
  }
  return gainsList;
};

记录的错误:错误:FirebaseError:无效的集合引用。集合引用必须有奇数个段,但 members/JhonDoe 有 2 个。

变化:

 try {
    await db
      .collection("members")
      .doc(`${dbName}`)
      .get()
      .then((doc) => {
        if (doc.exists) {
          console.log("Document data:", doc.data());
          gainsList.push(doc.data());
          console.log(gainsList);
        } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");  //this is being consoled
        }
      })
      .catch((error) => {
        console.log("Error getting document:", error);
      });
  } catch (error) {
    console.log(error);
  }
  console.log(gainsList);
  return gainsList;
};

'没有这样的文件'正在被安慰我已经在 React 组件中安慰了 gainList 并且它说等待承诺。

感谢您的帮助!

我现在正在使用实时数据库,因为我无法更正它

//set members' daily gains
export const setMembersDailyGains = async (name, gain, expense, date) => {
  const dbName = name.replace(/\s/g, "");
  const memberGainsRef = database.ref(`dailyGains/${dbName}/${date}`);
  const gainObj = {
    date: date,
    gain: gain,
    expense: expense,
  };
  await memberGainsRef.push(gainObj);
};


//get members' daily gains
export const getMembersDailyGains = (name) => {
  const dbName = name.replace(/\s/g, "");
  const memberGainsRef = database.ref(`dailyGains/${dbName}`);
  const gainsList = [];
  try {
    memberGainsRef.on("value", function (snapshot) {
      snapshot.forEach(function (childSnapshot) {
        childSnapshot.forEach(function (cchildSnapshot) {
          cchildSnapshot.forEach(function (ccchildSnapshot) {
            const item = ccchildSnapshot.val();
            item.key = ccchildSnapshot.key;
            gainsList.push(item);
          });
        });
      });
      console.log(gainsList);
    });
  } catch (error) {
    console.log(error);
  }
  console.log(gainsList);
  return gainsList;
};

我仍然想使用firestore。

标签: javascriptreactjsfirebasegoogle-cloud-firestore

解决方案


推荐阅读