Firestore 读取太多数据 (Ionic React) (ReactJS)

Posted

技术标签:

【中文标题】Firestore 读取太多数据 (Ionic React) (ReactJS)【英文标题】:Firestore reads too much data (Ionic React) (ReactJS) 【发布时间】:2020-10-06 07:54:41 【问题描述】:

所以我有这个应用程序使用 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 的教程视频,但还是不明白。

【问题讨论】:

我强烈推荐阅读NoSQL data modeling 并观看Getting to know Cloud Firestore 系列。 【参考方案1】:

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

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

如果您希望仅在参数之一更改时发生调用,请参阅有关有条件触发效果的文档 https://reactjs.org/docs/hooks-reference.html#conditionally-firing-an-effect

【讨论】:

效果很好!谢谢你!【参考方案2】:

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

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

【讨论】:

以上是关于Firestore 读取太多数据 (Ionic React) (ReactJS)的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:将 angularfire2 异步数据传递为 Ionic 3 navParams 不起作用

使用 ionic 3 中的 Angularfire2 从 Firestore 获取集合文档的 ID [重复]

Observable 在 display 、 ionic app 和 angular fire 从 firestore 获取值后失去价值

如何从firestore获取当前用户数据?

更新firestore数据后显示重复事件,但firestore中的数据本身不重复

如何从 kotlin 中的 firestore 读取映射数据