firebase Firestore getCountFromServer不是真实的更新吗?

yptwkmov  于 2023-02-05  发布在  其他
关注(0)|答案(3)|浏览(152)

我正在使用React应用程序的getCountFromServer()来显示集合中的文档数。但是,当用户在前端删除文档或创建文档时,计数不会实时更新。是否可以修复此问题,或者用户必须始终重新加载页面才能查看最新数据?

cuxqih21

cuxqih211#

文件上写着,着重号是我的:
count()聚合查询当前仅支持通过直接服务器响应。查询仅由Cloud Firestore后端提供,跳过本地缓存和任何缓冲更新。此行为与Cloud Firestore事务内执行的操作相同。您当前无法将count()查询与实时侦听器和离线查询一起使用。
所以,不,你不能得到实时计数更新。你将不得不再次提出请求以获得更新。是否需要页面刷新由你决定。

wlzqhblo

wlzqhblo2#

正如@DougStevenson在他的评论中提到的,当你使用count()时,你不可能获得实时更新。你确实可以在每次需要的时候调用count(),但是有一个解决方案。
要解决这个问题,您应该考虑在文档中的已知路径下存储一个计数器,然后在每次添加新文档时递增计数器的值,或者在每次删除文档时递增计数器的值decrement。要获得实时更新,只需在该文档上附加一个persistent listener,您就可以及时了解集合中文档的数量。
除此之外,如果您的文档集越来越大(〉10,000,000个文档),那么上面的解决方案可能是您唯一的解决方案。对此,请查看下面帖子中@FrankvanPuffelen的回答:

6gpjuf90

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)
    }
  });
});

这样,您就不必再次计算计数或在任何地方维护计数。

相关问题