您如何从Firestore读取数据?

时间:2019-05-27 22:44:02

标签: javascript firebase google-cloud-firestore

我正在尝试学习如何使用Firestore。

google documentation说尝试这种格式:

db.collection("users").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
});

因此,我用它来做到这一点(将数据库更改为fsDB,将“用户”更改为“新闻通讯”

fsDB.collection("newsletters").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
});

尝试此操作时,出现一条错误,提示未定义querySnapshot。附有错误消息的屏幕截图。

enter image description here

我看过this post并尝试了以下建议:

fsDB.collection("newsletters").query.get().then(function(querySnapshot) { 

                            if (querySnapshot.empty) { 
                                console.log('no documents found');
                            } else {
                                    querySnapshot.docs.map(function (documentSnapshot) {
                                        console.log(documentSnapshot.data().name); 
                                    });
                            }

                        });

这种尝试会使用if语句生成一个解析错误,但是我也找不到解决此问题的方法。

这必须有一个简单的解决方案,但我不知道如何从数据库中获取记录。

下次尝试

我尝试将代码移到return语句上方,并按如下所示的屏幕快照所示放入变量中,但仍会产生错误,如图所示。无论我保留还是丢失querySnapshot的方括号,这些错误都是相同的。

添加状态

class Fndate extends React.Component {
    state = {
        options: [],
        anzic: [],
        country: [],
        region: [],

    }

    selectCountry (val) {
        this.setState({ country: val });
      }

      selectRegion (val) {
        this.setState({ region: val });
      }

    async componentDidMount() {
        // const fsDB = firebase.firestore(); // Don't worry about this line if it comes from your config.
        let options = [];
        await fsDB.collection("abs_for_codes").get().then(function (querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, ' => ', doc.data());
            options.push({
                value: doc.data().title.replace(/( )/g, ''),
                label: doc.data().title + ' - ABS ' + doc.id
            });
            });
        });


        let anzic = [];
        await fsDB.collection("anzic_codes").get().then(function (querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, ' => ', doc.data());
            anzic.push({
                value: doc.data().Title.replace(/( )/g, ''),
                label: doc.data().Title + ' - ANZIC ' + doc.id
            });
            });
        });


            await fsDB
            .collection("newsletter")
            .get().then((querySnapshot) => {
                querySnapshot.forEach((doc) => {
                console.log(`${doc.id} => ${doc.data().email}`);
                }
            );
            });

        this.setState({
            options,
            anzic
        });
    }

enter image description here 5] 5

3 个答案:

答案 0 :(得分:1)

我相信您正在使用React,而我刚意识到您正在render方法中调用该方法。

尝试在componentDidMount中进行操作。可以找到参考文献here

因此您的代码将如下所示:

class YourClass extends React.Component {
   componentDidMount(){
      fsDB.collection("newsletters").get().then((querySnapshot) => {
         querySnapshot.forEach((doc) => {
            console.log(`${doc.id} => ${doc.data()}`);
         });
      });
   }
   render(){
      return (....your existing jsx....)
   }
}

请注意,我不知道您的类名或组件的定义方式。但是我只是说,您需要在componentDidMount中移动代码。

我们看不到您的整个文件。但我确定这是语法错误(尤其是JSX)

答案 1 :(得分:0)

我认为您应该摆脱“ .query”。 如果集合中有数据,则.empty返回false。 但我想知道,为什么querySnapshot在您的情况下没有定义。

db.collection("lessons").get()
  .then(function(querySnapshot) { 
    if (!querySnapshot.empty) {
        querySnapshot.docs.map(function(documentSnapshot) {
        console.log(documentSnapshot.data().name); 
     })
    } else {
    console.log('no documents found');
    }   
});

控制台

console

答案 2 :(得分:-1)

您可以为此使用自动脚本。 您只需要python和firebase_admin。

  1. 通过pip install firebase_admin
  2. 下载https://github.com/harshit0209/firestore_backup
  3. 现在运行getData.py脚本。
  4. 提供您的Firebase项目私钥的路径。
  5. 现在提供文档名称。