【问题标题】:onSnapshot not working when exceeds limit in firebase超过firebase中的限制时onSnapshot不起作用
【发布时间】:2021-03-25 18:23:59
【问题描述】:

我正在尝试限制在我的网络应用程序中显示的消息数量,当我尝试使用 limitorderBy 时,它在超过其限制(即 15 条)后停止显示新消息,所以我做错了什么?

PS:我试过orderBy("createdAt", "desc"),它显示新消息,但按降序排列

代码:

useEffect(() => {
    const unsub = db
      .collection("messages")
      .orderBy("createdAt")
      .limit(15)
      .onSnapshot((snapshot) => {
        setMessages(
          snapshot.docs.map((doc) => ({ id: doc.id, msg: doc.data() }))
        );
      });
    return unsub;
  }, []);

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore


    【解决方案1】:

    使用仅附加列表时,您可以限制最初返回的值的数量,但仍然可以通过使用 limitToLast() 获得未来的添加:

    db.collection("...")
      .orderBy("timestamp")
      .limitToLast(3)
      .onSnapshot(change => console.log(change.type, change.doc.id));
    

    Here's a working example

    【讨论】:

    • 是的,谢谢它的工作,但也检查一下code,我的意思是它是如何工作的
    • @加藤:嗯? Firestore 何时添加 limitToLast()
    【解决方案2】:

    您正在为仅这 15 个文档的更改建立一个监听器 - 您已经限制了哪些文档正在被监视。该查询正在做它应该做的事情。听起来这不是你真正想要的。

    您可以只提取 (.get()) 15 个文档,然后使用 .startAfter().get() 根据您想要的任何事件(点击等)获取下一组。

    如果(大如果)您需要监控子文档集的更改,那么您需要删除您的第一组文档的侦听器,并在下一组文档上创建一个新的侦听器。

    记住:onSnapShot() 是一个 LISTENER,监听变化。如果这不是真正的要求,只需使用.get()

    【讨论】:

      【解决方案3】:

      如果您希望显示 15 条最新消息,这意味着您将希望在降序创建时进行排序:

      db
        .collection("messages")
        .orderBy("createdAt", "desc")
        ...
      

      如果您仍想在底部显示最新消息,则必须在应用程序代码中反转消息。

      【讨论】:

      • 是的,这就是我的想法,但后来它是如何工作的code
      • 我不确定你的意思。您是否在该代码中添加了"desc"?当你这样做时发生了什么变化?
      • 我的意思是检查我上面评论中给出的链接
      猜你喜欢
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2019-02-26
      • 1970-01-01
      • 2014-07-31
      • 2021-06-18
      相关资源
      最近更新 更多