【问题标题】:Firestore - How to fetch 5 latest document with order by time ascFirestore - 如何按时间顺序获取 5 个最新文档
【发布时间】:2020-11-20 03:02:10
【问题描述】:

所以我有以下代码:

    firebase.firestore().collection(collection).doc(doc).collection(collection)
       .orderBy("time", "asc").onSnapshot(function(querySnapshot) {
        querySnapshot.docChanges().forEach(function(change) {
            if (change.type === "added") {
                msgData(change);
            }
            if (change.type === "modified") {
                msgData(change);
            }
        });
    });

它让我可以看到作为聊天应用程序的文档列表

我将迭代我在消息元素中检索到的数据,在消息元素下,有一个输入文本区域来添加新消息。消息将从最小时间到最大时间(时间戳)排序,以便最新消息将出现在输入文本区域的正上方。 Ilustration 聊天应用程序

问题是如果文档数量很大,聊天应用会很重,因为它会加载大量文档,所以我想限制消息以避免这个问题。但是每当我找到解决方案时,就是按降序对时间进行排序,然后再限制。如果我这样做,最新的聊天消息(输入文本区域上方的消息)是我获取的最旧的数据...

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    如果不添加一些客户端代码来对结果进行第二次排序,这对于单个查询是不可能的。

    您将需要限制为 5 的降序排序。

        firebase.firestore().collection(collection).doc(doc).collection(collection)
           .orderBy("time", "desc").limit(5)
    

    这应该会按时间为您提供 5 个最新文档。但是,如果您想迭代或按升序显示它们,则必须在客户端中按时间升序对文档进行重新排序。

    【讨论】:

    • 哦,我明白了,所以在我使用 orderby desc 从 firestore 获取数据后,我第二次排序以反转数据对吗?
    • 是的,这就是你能做的。
    • 这对 Doug 很有帮助...我正在查找完全不同的东西,但在遇到您的答案之前忘记了我有同样的问题...谢谢!
    • @DougStevenson 感谢 Doug 先生,所以我一直在努力解决这个问题。我试图从这个查询中获取数组, var test = firebase.firestore().collection(collection).doc(doc).collection(collection) .orderBy("time", "asc").onSnapshot(function(querySnapshot) { querySnapshot.docChanges() });但是当我检查数据时,它返回 ƒ (){i.Xl(),r.hs.ws(function(){return La(r.B_,o)})}。知道如何从 docChanges() 函数中获取数组吗?谢谢..
    • 如果您有新问题,请单独发布。
    【解决方案2】:

    问题解决了。我所要做的就是在 docChanges 函数的末尾添加 reverse()。

    firebase.firestore().collection(collection).doc(doc).collection(collection).orderBy("time", "desc").limit(10).onSnapshot(function(querySnapshot) {
        querySnapshot.docChanges().reverse().forEach(function(change) {
            var data = {
                id: change.doc.id,
                a: change.doc.data().a,
                b: change.doc.data().b,
                c: change.doc.data().c,
                d: change.doc.data().d,
                e: change.doc.data().e,
                f: change.doc.data().f,
            };
    
            if (change.type === "added") {
                msgData(data);
            }
            if (change.type === "modified") {
                msgData(data);
            }
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      相关资源
      最近更新 更多