【问题标题】:Map items of collection snapshot in Firebase Firestore在 Firebase Firestore 中映射集合快照项
【发布时间】:2018-03-18 18:01:28
【问题描述】:

Firebase Firestore Guides 展示如何使用forEach 在集合快照中迭代文档:

db.collection("cities").get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        console.log(doc.id, " => ", doc.data());
    });
});

我以为它也会支持map,但事实并非如此。如何映射快照?

【问题讨论】:

  • 如果他们不支持所有的 Array.prototype 方法,我觉得他们不应该打开这罐蠕虫

标签: database firebase google-cloud-firestore


【解决方案1】:

你可以试试这个

FirebaseFirestore.instance
  .collection('Video_Requests')
  .get()
  .then((QuerySnapshot querySnapshot){querySnapshot.docs.forEach((doc){
    print(doc.data());
   });
});

【讨论】:

    【解决方案2】:
    // https://firebase.google.com/docs/firestore/query-data/get-data
    const querySnapshot = await db.collection("students").get();
    
    // https://firebase.google.com/docs/reference/js/firebase.firestore.QuerySnapshot?authuser=0#docs
    querySnapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }));
    

    【讨论】:

    • 正是我正在寻找的答案。谢谢!祝你有美好的一天:)
    【解决方案3】:

    我发现使用 ma​​p 并获取您的文档 ID 的更好方法如下:

    从我希望在构造函数中更新的对象数组开始:

        this.state = {
                    allmystuffData: [
                    {id: null,LO_Name: "name", LO_Birthday: {seconds: 0, nanoseconds: 0},    
                    LO_Gender: "Gender", LO_Avatar: "https://someimage", LO_Type: "xxxxx"},],
        };
    

    在我的函数中执行以下操作

        const profile = firebase
            .firestore()
            .collection("users")
            .doc(user.uid)
            .collection("stuff")
            .get()
            .then( async (querySnapshot) => {
                console.log("number of stuff records for ",user.uid," record count is: ", 
                querySnapshot.size);
                const profile = await Promise.all(querySnapshot.docs.map( async (doc) => {
                    const stuffData = doc.data()
                    stuffData.id = doc.id
                    condole.log("doc.id => ",doc.id)
                    return stuffData
            }));
        
            this.setState({allmystuffData: profile});
            })
            .catch(function (error) {
                console.log("error getting stuff: ", error);
            })
    

    在此示例中,我使用查询快照读取集合中的所有文档,并在它们之间进行映射。 promise.all 确保在将所有记录呈现到屏幕之前返回所有记录。我将文档 id 添加到返回数组中每个对象的“id”元素中,然后使用 setstate 将我的状态数组替换为查询返回的数组。

    【讨论】:

      【解决方案4】:

      厌倦了 Firestore 在他们的课堂上返回东西或其他什么。这是一个助手,如果你给它一个dbcollection,它将返回该集合中的所有记录作为解析实际数组的承诺。

      const docsArr = (db, collection) => {
        return db
          .collection(collection)
          .get()
          .then(snapshot => snapshot.docs.map(x => x.data()))
      }
      
      ;(async () => {
        const arr = await docsArr(myDb, myCollection)
        console.log(arr)
      })()
      

      【讨论】:

      • 好帮手!我也会添加 id snapshot.docs.map(x => {x.id, ...x.data()})
      【解决方案5】:

      这是另一个例子

      var favEventIds = ["abc", "123"];
      
      const modifiedEvents = eventListSnapshot.docs.map(function (doc) {
          const eventData = doc.data()
          eventData.id = doc.id
          eventData.is_favorite = favEventIds.includes(doc.id)
      
          return eventData
      })
      

      【讨论】:

        【解决方案6】:

        答案是:

        querySnapshot.docs.map(function(doc) {
          # do something
        })
        

        The Reference page for Firestore 显示快照上的docs 属性。

        docs non-null 非空 firebase.firestore.DocumentSnapshot 数组

        QuerySnapshot 中所有文档的数组。

        【讨论】:

        • Cloud Firestore querySnapshot documentation 中,'docs' 属性似乎变成了 'documents'。
        • @ArseneLupin 做documents 支持.map.forEach?
        • 我已经成功使用了.forEach。直觉说 .map 应该在 List 上工作,但我没有尝试过
        • .forEach() 实际上会返回DocumentSnapshots,而.docs.map() 只会返回QueryDocumentSnapshot ,然后您必须运行get()
        猜你喜欢
        • 2021-10-09
        • 2019-08-13
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        相关资源
        最近更新 更多