【问题标题】:Reduce Firestore reads while sharing data with multiple components在与多个组件共享数据的同时减少 Firestore 读取
【发布时间】:2021-04-12 12:29:41
【问题描述】:

我有一个带有 App 组件的 React Web 应用程序,它从 Firestore 集合中获取所有用户,并使用 .onSnapshot() 使其保持实时和最新状态:

useEffect(() => {
   firebase.firestore().collection('users').onSnapshot((snap) => {
      setUsers(snap.docs.map((res) => res.data());
   });
}, [setUsers]);

App 组件与CheckinArchiveUser 组件共享获取的数据。

 _______________________________________________________________________
|                                                                       |
|     APP --------------------------------------------------            |
|            |                      |                      |            |
|    ________|_________     ________|_________     ________|_________   |
|   |                  |   |                  |   |                  |  |
|   |      CHECKIN     |   |      ARCHIVE     |   |       USER       |  |
|   |__________________|   |__________________|   |__________________|  |
|    checkedin === null     checkedin !== null        match uid         |
|_______________________________________________________________________|
const Checkin = ({ users }) => {
  return (
    <>
      {users
        .filter(f => f.checkedin === null)
        .map((user) => (
          <Link to={`/user/${user.uid}`} key={user.uid}>{user.name}</Link>
        ))}
    </>
  );
};
const Archive = ({ users }) => {
  const [search, setSearch] = useState("");
  return (
    <>
      <input type="text" value={search} onChange={(e) => setSearch(e.target.value)} />
      {users
        .filter(f => f.checkedin !== null)
        .filter(s => s.name.toLowerCase().includes(search.toLowerCaser())
        .map((user) => (
          <Link to={`/user/${user.uid}`} key={user.uid}>{user.name}</Link>
        ))}
    </>
  );
};
const User = ({ match, users }) => {
  return (
    <>
      {users
        .filter(f => f.uid === match.params.uid)
        .map((user) => (
          <div key={user.uid}>{user.name}</div>
        ))}
    </>
  );
};

我的问题是,该应用每天最多可扩展 500 个文档。我正在寻找如何减少读取量的解决方案,因为 Firestore 每天只有 50.000 次免费读取。

该应用大部分时间都在Checkin 组件上运行。我目前在应用程序组件上加载整个数据,以便每次用户在CheckinUserArchive 组件之间切换时都不会重新获取数据。另外一个新用户是 1 只读的,因为我将它传递给 User 组件而不是获取它。

如何进一步减少阅读次数?

编辑: 该应用程序是做什么的? 还有另一个应用程序,用户可以在其中创建签到票。 当有新用户时,应用程序会在Checkin 组件中显示该用户。然后单击该用户,您会在User 视图中查看并验证他的所有数据。然后您签入用户。这将设置checkedin = true 并且用户移动到存档。 如果您想修改用户,您可以使用存档过滤用户并重新访问它们。

每张工单都是用户集合中的一个用户文档。目前我有大约 6000 个用户,签入应用程序只为每个用户生成一次写入。但我有更多的 dann 700.000 阅读。

Checkin 组件同时拥有 10-20 个用户。存档拥有数千名用户中的其余部分。

【问题讨论】:

  • 我不确定我是否完全理解该应用程序的意义,但一种可能的解决方案是将不同的部分拆分为 Firestore 中的单独集合。例如)用户集合、签入集合和存档集合。那么只监听app组件对应的集合上的变化呢?如果您确实需要访问所有最新的用户信息,并且该信息经常更改 - 您将有大量阅读。
  • 我在问题的末尾添加了应用程序的用途。

标签: reactjs firebase google-cloud-firestore


【解决方案1】:

制作用户/“签到票”的应用程序是否会更新相同的用户集合以获取其他任何内容?如果是这样,将门票移动到他们自己的收藏中会减少读取。

此外,根据您需要查看存档的频率,您可以通过添加 .where('checkedin', '!=', true) 查询来限制您的侦听器。如果数据可以在此应用功能之外更改,这也只会改善读取。

基本上,它归结为要么移动到单独的集合中以限制更改的文档数量,要么限制您正在积极收听的文档数量。

【讨论】:

  • 工单创建一次为每个用户创建一个文档。 Checkin 接收来自同一集合的用户。我只使用一个集合,因为最多大约有 10-20 张开放票。其余的都是存档。查看我最近对我的问题所做的编辑。
  • 这个答案的要点仍然存在。每次加载/重新加载签入应用程序时,都会产生 6000 次读取。每次更新签入字段(或文档上的任何其他字段)时,您都会发生读取。除非您限制 onSnapshot 正在侦听的文档数量,否则无法解决这个问题。
  • 但是当我有不同的 Checkin 和 Archive 集合时,每次路由到存档并返回到 checkin 都会重新加载所有用户,不是吗?所以这将是相同的方法,但我可以安全读取 10-20 次,对吗?
猜你喜欢
  • 2021-04-04
  • 2021-11-23
  • 2020-03-05
  • 2021-06-08
  • 2019-02-01
  • 1970-01-01
  • 2018-05-12
  • 2021-05-22
  • 2022-01-12
相关资源
最近更新 更多