繁体   English   中英

Firebase 实时数据库:orderByChild 未按预期工作(即使在使用 forEach 读取数据后)

[英]Firebase realtime database : orderByChild not working as expected (Even after reading the data using forEach)

我的数据库如下所示: 在此处输入图像描述

请注意, dev-user-messages处于根级别。 现在我想像这样查询它:

get(query(ref(db, path), orderByChild('lastModified'))).then((snapshot) => {
            if (snapshot.exists()) {
                const res = snapshot.val();
                console.log(res);
            }
        });

但是,无论我以哪种方式订购,我都尝试过使用limitToLastlimitToFirst ,但它们总是按照键的顺序返回响应(即 a、b、c、d):

{
    "a": {
        "lastModified": 1
    },
    "b": {
        "lastModified": 2
    },
    "c": {
        "lastModified": 10
    },
    "d": {
        "lastModified": 5
    }
}

我在这里做错了什么吗?

编辑:

按照 Frank 的建议并参考以下帖子,我将查询更新为如下所示:

React.useEffect(() => {
        const path = formMessagesPath(process.env.NODE_ENV === 'production');
        console.log(path);
        get(
            query(ref(db, path), orderByChild('lastModified'), limitToLast(limit))
        ).then((snapshot) => {
            if (snapshot.exists()) {
                console.log(snapshot.forEach((item) => console.log(item.val())));
            }
        });
    }, []);

但是改变这一行:

get(
            query(ref(db, path), orderByChild('lastModified'), limitToLast(limit))
        )

Output:

在此处输入图像描述

get(
            query(ref(db, path), orderByChild('lastModified'), limitToFirst(limit))
        )

产生相同的结果:Output: 在此处输入图像描述

我知道调用.val()重置顺序,但是当我使用forEach时现在的问题是什么?

编辑 2:好的,现在我想我完全理解了这一点,所以我的问题主要是如何更改排序顺序。 (目前好像是升序,怎么让它降序?):

期望的结果:

数据:

{
    "a": {
        "lastModified": 1
    },
    "b": {
        "lastModified": 2
    },
    "c": {
        "lastModified": 10
    },
    "d": {
        "lastModified": 5
    }
}

我想要两种情况:

1.获取最后N个孩子(按lastModified键降序排列):[10,5,2] 2.获取最后N个孩子(按lastModified键升序排列):[2,5,10]

我的理解是 orderBy('lastModified') 将数据订购为: [1,2,5,10]和 limitToLast(100) 将返回数据为: [1,2,5,10]但是,当我执行 limitToFirst(100) ),数据保持不变: [1,2,5,10]

现在,如果我希望它先按降序排列,然后根据我的要求应用limitToFirstlimitToLast怎么办?

正如 Frank 所建议的,这里的问题是当使用.val()方法提取值时,键顺序会改变,但是使用类似的东西:

const results = [];
snapshot.forEach((item) => results.push(item.val()));

会工作。 目前没有办法支持 firebase 中的排序顺序,但一种创新的方法可能是让您的时间戳乘以 -1 并且 rest 将自动得到处理。

然而,这有一个限制,你必须决定你想要的数据顺序,并且没有办法在 firebase 端反转顺序,而是你可以在你的前端应用程序或后端应用程序上执行相同的操作。

我不确定为什么这个问题再次被重新打开,但这就是我为我的回答得出的全部结论。 我现在用这个答案结束这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM