我正在使用React应用程序的getCountFromServer()来显示集合中的文档数。但是,当用户在前端删除文档或创建文档时,计数不会实时更新。是否可以修复此问题,或者用户必须始终重新加载页面才能查看最新数据?
getCountFromServer()
cuxqih211#
文件上写着,着重号是我的:count()聚合查询当前仅支持通过直接服务器响应。查询仅由Cloud Firestore后端提供,跳过本地缓存和任何缓冲更新。此行为与Cloud Firestore事务内执行的操作相同。您当前无法将count()查询与实时侦听器和离线查询一起使用。所以,不,你不能得到实时计数更新。你将不得不再次提出请求以获得更新。是否需要页面刷新由你决定。
wlzqhblo2#
正如@DougStevenson在他的评论中提到的,当你使用count()时,你不可能获得实时更新。你确实可以在每次需要的时候调用count(),但是有一个解决方案。要解决这个问题,您应该考虑在文档中的已知路径下存储一个计数器,然后在每次添加新文档时递增计数器的值,或者在每次删除文档时递增计数器的值decrement。要获得实时更新,只需在该文档上附加一个persistent listener,您就可以及时了解集合中文档的数量。除此之外,如果您的文档集越来越大(〉10,000,000个文档),那么上面的解决方案可能是您唯一的解决方案。对此,请查看下面帖子中@FrankvanPuffelen的回答:
6gpjuf903#
如果您使用getCountFromServer()加载初始计数,然后希望在删除文档时为所有活动用户递减该计数,则可以在同一集合 * 上使用侦听器 *,并在前端更新状态,如下所示:
import { collection, query, where, onSnapshot } from "firebase/firestore"; // initial state loaded by getCountFromServer() const [count, setCount] = useState(10); const q = query(collection(db, "collectionName")); const unsubscribe = onSnapshot(q, (snapshot) => { snapshot.docChanges().forEach((change) => { if (change.type === "removed") { console.log("Removed document: ", change.doc.data()); // TODO: Decrement the count in state // e.g. setCount(count - 1) } }); });
这样,您就不必再次计算计数或在任何地方维护计数。
3条答案
按热度按时间cuxqih211#
文件上写着,着重号是我的:
count()聚合查询当前仅支持通过直接服务器响应。查询仅由Cloud Firestore后端提供,跳过本地缓存和任何缓冲更新。此行为与Cloud Firestore事务内执行的操作相同。您当前无法将count()查询与实时侦听器和离线查询一起使用。
所以,不,你不能得到实时计数更新。你将不得不再次提出请求以获得更新。是否需要页面刷新由你决定。
wlzqhblo2#
正如@DougStevenson在他的评论中提到的,当你使用count()时,你不可能获得实时更新。你确实可以在每次需要的时候调用count(),但是有一个解决方案。
要解决这个问题,您应该考虑在文档中的已知路径下存储一个计数器,然后在每次添加新文档时递增计数器的值,或者在每次删除文档时递增计数器的值decrement。要获得实时更新,只需在该文档上附加一个persistent listener,您就可以及时了解集合中文档的数量。
除此之外,如果您的文档集越来越大(〉10,000,000个文档),那么上面的解决方案可能是您唯一的解决方案。对此,请查看下面帖子中@FrankvanPuffelen的回答:
6gpjuf903#
如果您使用
getCountFromServer()
加载初始计数,然后希望在删除文档时为所有活动用户递减该计数,则可以在同一集合 * 上使用侦听器 *,并在前端更新状态,如下所示:这样,您就不必再次计算计数或在任何地方维护计数。