Firestore读取的数据过多Ionic ReactReactJS

如何解决Firestore读取的数据过多Ionic ReactReactJS

所以我有一个使用Ionic React和Cloud Firestore作为数据库的应用程序。通常,我使用以下代码来检索数据:

const [teacher,setTeacher] = useState('');
const history = useHistory();
const [users,setUsers] = useState([{}]);

async function obtainData() {
    const querySnapshot = db.collection('TEACHER_DATA').where('email','==',Cookies.get('email'));
    const awaitSnapshot = await querySnapshot.get();
    const data = awaitSnapshot.docs.map(doc => doc.data().name);
    setTeacher(String(data));

    const querySnapshot2 = db.collection('CLASS').where('class_teacher',teacher);
    const awaitSnapshot2 = await querySnapshot2.get();
    const data2 = awaitSnapshot2.docs.map(doc => doc.data());
    setUsers(data2);
}

obtainData();

return (
    <div>{
        users.map((value: any,index) => (
                <IonCard key={index} onClick={() => {
                    Cookies2.set('id',value.student_id);
                    history.push({
                        pathname: '/Student_biodata',state: value.student_id
                    })
                  }} class="students">
                      <IonCardTitle>
                          {value.class_student}
                      </IonCardTitle>
                    {value.branch}
                    <IonCard id="mini-picture">
                        <IonImg src={'/assets/propic/' + value.student_id + '.jpg'}></IonImg>
                    </IonCard>
                    
                </IonCard>
            ))}
    </div>
);

代码显示了我需要的数据。但是,当我检查Firestore使用情况时,它在15分钟内已经读取了6K。如果某天用户数在增加,这是不合适的。我的应用将立即达到每日限额配额。我的Firestore项目中的文档少于30个。

我有什么解决方案可以减少Firestore中的读取?是否有任何示例可以在Nosql Firestore中提供更好的结构以减少读取? 我已经看过Firebase提供的有关Firestore的教程视频,但仍然听不懂。

解决方法

没有一种特定的最佳方法来减少Firestore中的读取,因为这完全取决于您的应用程序。例如,对于Android,iOS和Web应用程序,Firestore支持offline data,因此您可以缓存数据以供使用,而不必每次都执行get和访问数据库-您可以获取示例here

总而言之,没有更好或正确的方法来构建数据库或查询,因为它们需要满足您的需求以及您对应用程序的需求,因此,它始终取决于。考虑到这一点,我建议您看一下上面提到的链接以及类似的情况here,在这里您可以找到一些缓存数据的示例,以减少数据库中的读取,就像您的应用程序一样, where子句与静态值进行比较。

,

问题是您在页面的每个渲染上都调用obtainData,而不是在页面加载时调用一次。您可以使用useEffect来类似于componentDidMount

useEffect(()=>{
  obtainData();
},[]);

请参阅有关有条件触发效果的文档,如果您希望仅在其中一个参数更改时才进行调用,则可能需要 https://reactjs.org/docs/hooks-reference.html#conditionally-firing-an-effect

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?