[英]Firebase Realtime Database orderByChild data structure - ReactJS
[英]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);
}
});
但是,无论我以哪种方式订购,我都尝试过使用limitToLast
和limitToFirst
,但它们总是按照键的顺序返回响应(即 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))
)
我知道调用.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]
现在,如果我希望它先按降序排列,然后根据我的要求应用limitToFirst
或limitToLast
怎么办?
正如 Frank 所建议的,这里的问题是当使用.val()
方法提取值时,键顺序会改变,但是使用类似的东西:
const results = [];
snapshot.forEach((item) => results.push(item.val()));
会工作。 目前没有办法支持 firebase 中的排序顺序,但一种创新的方法可能是让您的时间戳乘以 -1 并且 rest 将自动得到处理。
然而,这有一个限制,你必须决定你想要的数据顺序,并且没有办法在 firebase 端反转顺序,而是你可以在你的前端应用程序或后端应用程序上执行相同的操作。
我不确定为什么这个问题再次被重新打开,但这就是我为我的回答得出的全部结论。 我现在用这个答案结束这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.