Javascript Firestore-如何按asc时间获取5份最新文档和订单

Javascript Firestore-如何按asc时间获取5份最新文档和订单,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,因此,我有以下代码: firebase.firestore().collection(collection).doc(doc).collection(collection) .orderBy("time", "asc").onSnapshot(function(querySnapshot) { querySnapshot.docChanges().forEach(function(change) {

因此,我有以下代码:

    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);
            }
        });
    });
它可以让我看到一个文档列表,这些文档将作为聊天应用

我将迭代在message元素中检索的数据,在message元素下,有一个InputTextArea用于添加新消息。消息将从最小时间到最大时间戳进行排序,以便最新消息将显示在输入文本区域的正上方。 说明聊天应用程序


问题是,如果文档数量很大,聊天应用程序将非常沉重,因为它加载了大量文档,因此我希望限制消息以避免此问题。但每当我发现解决办法时,就是按降序排序,然后限制时间。如果我这样做,输入文本区域上方的最新聊天信息消息就是我获取的最旧数据…

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

您将需要降序排序,限制为5

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

这将为您提供5份最新的文档。但是,如果要以升序迭代或显示文档,则必须在客户端中按升序时间对文档进行重新排序。

如果不添加一些客户端代码以对结果进行第二次排序,单次查询就不可能做到这一点

您将需要降序排序,限制为5

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

这将为您提供5份最新的文档。但是,如果您想按升序迭代或显示文档,则必须在客户端按升序时间对文档重新排序。

问题解决了。我所要做的就是在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);
        }
    });
});

问题解决了。我所要做的就是在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);
        }
    });
});

哦,我明白了,所以在我用orderby desc从firestore获得数据后,我需要进行第二次排序以反转数据,对吗?是的,这就是你能做的。这真的很有帮助Doug。。。我查的是完全不同的东西,我忘记了我有同样的问题,直到我找到了你的答案。。。谢谢@道格·史蒂文森感谢道格先生,所以我一直在努力解决这个问题。我正在尝试从此查询获取数组,var test=firebase.firestore.collectioncollection.docdoc.collectioncollection.orderBytime,asc.onsnapshot函数querySnapshot{querySnapshot.docChanges};但是当我检查数据时,它返回的是{i.Xl,r.hs.wsfunction{return Lar.B_,o}。知道如何从docChanges函数获取数组吗?谢谢。如果你有新问题,请单独发布。哦,我明白了,所以在我用orderby desc从firestore获得数据后,我会第二次排序以反转数据,对吗?是的,这就是你能做的。这真的很有帮助Doug。。。我查的是完全不同的东西,我忘记了我有同样的问题,直到我找到了你的答案。。。谢谢@道格·史蒂文森感谢道格先生,所以我一直在努力解决这个问题。我正在尝试从此查询获取数组,var test=firebase.firestore.collectioncollection.docdoc.collectioncollection.orderBytime,asc.onsnapshot函数querySnapshot{querySnapshot.docChanges};但是当我检查数据时,它返回的是{i.Xl,r.hs.wsfunction{return Lar.B_,o}。知道如何从docChanges函数获取数组吗?谢谢。如果你有新问题,请单独发布。