【发布时间】: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 组件与Checkin、Archive 和User 组件共享获取的数据。
_______________________________________________________________________
| |
| 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 组件上运行。我目前在应用程序组件上加载整个数据,以便每次用户在Checkin、User 或Archive 组件之间切换时都不会重新获取数据。另外一个新用户是 1 只读的,因为我将它传递给 User 组件而不是获取它。
如何进一步减少阅读次数?
编辑:
该应用程序是做什么的?
还有另一个应用程序,用户可以在其中创建签到票。
当有新用户时,应用程序会在Checkin 组件中显示该用户。然后单击该用户,您会在User 视图中查看并验证他的所有数据。然后您签入用户。这将设置checkedin = true 并且用户移动到存档。
如果您想修改用户,您可以使用存档过滤用户并重新访问它们。
每张工单都是用户集合中的一个用户文档。目前我有大约 6000 个用户,签入应用程序只为每个用户生成一次写入。但我有更多的 dann 700.000 阅读。
Checkin 组件同时拥有 10-20 个用户。存档拥有数千名用户中的其余部分。
【问题讨论】:
-
我不确定我是否完全理解该应用程序的意义,但一种可能的解决方案是将不同的部分拆分为 Firestore 中的单独集合。例如)用户集合、签入集合和存档集合。那么只监听app组件对应的集合上的变化呢?如果您确实需要访问所有最新的用户信息,并且该信息经常更改 - 您将有大量阅读。
-
我在问题的末尾添加了应用程序的用途。
标签: reactjs firebase google-cloud-firestore