【问题标题】:How do I get document and nested collection in a document in a Cloud Firestore collection using Version 9 of the Modular Web SDK?如何使用 Modular Web SDK 版本 9 在 Cloud Firestore 集合中的文档中获取文档和嵌套集合?
【发布时间】:2021-11-19 02:02:51
【问题描述】:

我正在学习使用 Firestore 从集合中检索数据的教程。 有两件主要的事情:检索嵌套在该文档中的文档和集合。 我下面的代码基于 FireStore web v8,我想将其转换为 web 版本 9。 我发现它很复杂!

    useEffect(()=>{
        if(roomId){
            db.collection('rooms').doc(roomId).onSnapshot(snapshot => {
                setRoomName(snapshot.data().name);
            });

            db.collection('rooms').doc(roomId).collection("messages").orderBy("timestamp","asc").onSnapshot(snapshot => {
                setMessages(snapshot.docs.map(doc => doc.data()))
            });

        }
    },[roomId])

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-firestore es6-modules


    【解决方案1】:

    这只是为了别人......

    V8:

    export const fetchAccountAssets = (userID, accountID) => db()
      .collection('Accounts')
      .doc(userID)
      .collection('Assets')
      .get()
      .then((querySnapshot) => querySnapshot);
    

    V9:

    export const fetchAccountAssets = async (userID, accountID) => {
      return await getDocs(collection(db, 'Accounts', userID, 'Assets'));
    }
    

    我认为我不需要在这里等待,但是哦,好吧..

    【讨论】:

      【解决方案2】:

      试试这个:

      import { collection, query, where, doc, onSnapshot } from "firebase/firestore";
      
      useEffect(() => {
        onSnapshot(doc(db, "rooms", roomId), (doc) => {
          setRoomName(doc.data().name)
        });
      
        const q = query(collection(db, "rooms", roomId, "messages"), orderBy("timestamps"));
      
        onSnapshot(q, (querySnapshot) => {
          setMessages(querySnapshot.docs.map(doc => doc.data()))
        });
      }, [roomId])
      

      也结帐:

      【讨论】:

      • 首先,非常感谢您的帮助。但仍然无法正常工作,它说: Uncaught TypeError: Cannot read properties of undefined (reading 'indexOf') index.esm2017.js:1030
      • 我在 useEffect 中的 [] 之间添加了 roomId,但仍然是同样的错误
      【解决方案3】:

      这个应该能胜任!

          useEffect(() => {
              if(roomId){
                  onSnapshot(doc(db, "rooms", roomId), (document) =>{ 
                      setRoomName(document.data().name);
                  });
                  const msgColl = query(collection(db, "rooms", roomId, "messages"), orderBy("timestamp"));
                  onSnapshot(msgColl, (querySnapshot) => {
                      setMessages(querySnapshot.docs.map(msg => msg.data()))
                  });
              }
          }, [roomId])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-27
        • 2018-03-15
        • 1970-01-01
        • 2019-11-13
        • 2018-04-09
        • 2020-08-01
        • 2021-08-23
        相关资源
        最近更新 更多