javascript - Firebase 实时数据库 orderBy() 查询不起作用
问题描述
我有一个看起来像这样的 Firebase 实时数据库
我的浏览器扩展用于创建故事。每个故事(在“userStories”下)都与特定用户(authUID)相关联。authID 是用户使用 Firebase 身份验证登录的 ID。每个故事在写入“故事”时都会收到一个由 push() 生成的密钥。
我正在尝试使用 Javascript 检索数据并以相反的顺序对其进行排序。我想显示最先创建的最后一个故事。
我的 JavaScript 代码(顺便说一句不起作用)如下所示:
firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
{
sendResponse({type: "result", status: "success", data: snapshot.val(), request: request})
})
我的问题是我的查询语句有什么问题?
在排序方面没有发生任何事情。无论我尝试orderByValue()
,orderByKey()
还是orderByChild()
没有区别。
为什么结果没有排序。
编辑:
如果我将我的代码修改为以下...
firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
{
let results = [];
snapshot.forEach(function(child) {
console.log(child.key,child.val)
results.push({ key: child.key, value: child.val() });
console.log(results)
})
sendResponse({type: "result", status: "success", data: results, request: request})
})
这是控制台的输出...
如您所见,排序顺序仍在升序(这不是我想要的)。
我希望结果按降序排列。
谢谢你的建议。
编辑:
results.reverse()
通过添加行来反转数组,我得到了一些结果(不完全是我想要的) 。有一种最后的钥匙,但其余的都混在一起了。
{
let results = [];
snapshot.forEach(function(child) {
console.log(child.key,child.val)
results.push({ key: child.key, value: child.val() });
results.reverse()
console.log(results)
})
sendResponse({type: "result", status: "success", data: results, request: request})
})
控制台上的结果是:
编辑:
很抱歉做了这么多编辑,但这是最后一个。我找到了一个解决方案,方法是使用扩展运算符 [...] 复制数组结果,然后将其反转。我添加了该行res = [...results].reverse()
,这次我将结果按降序排序。
firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
{
let results = [];
let res = [];
snapshot.forEach(function(child) {
console.log(child.key,child.val)
results.push({ key: child.key, value: child.val() });
res = [...results].reverse()
console.log(res)
})
sendResponse({type: "result", status: "success", data: res, request: request})
})
结果如下:
解决方案
JSON 中的键是无序的。因此,虽然snapshot
有关于结果顺序的信息,但一旦您调用,该信息就会丢失snapshot.val()
。
如果您想维护有关订单的信息,您需要使用snapshot.forEach()
来遍历结果。
例如,您可以将结果转换为键和值数组:
firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
{
let results = [];
snapshot.forEach(function(child) {
results.push({ key: child.key, value: child.val() });
});
sendResponse({type: "result", status: "success", data: results, request: request})
})
推荐阅读
- python - 如果密钥对匹配,则从 json 返回/获取值 - Python
- python - Python Twine,Certifi,将包发布到 Pypi 时请求失败
- django - 获取 Django 编程错误:对于确实存在的列,该列不存在
- excel - 当我将 excel 文件保存到其他位置/重命名文件时,运行时错误“对象 '_Connection' 的方法 'Open' 失败”
- python - 将数据框的多列转换为字典
- javascript - Selection.modify("extend", "forward", "sentence"); 正在删除当前选定的单词,只选择句子的其余部分
- jupyter-notebook - JupyterHub 安装错误,运行命令时:'sudo /opt/jupyterhub/bin/jupyterhub –generate-config`
- google-cloud-platform - 如何在扳手中使用@parameter 插入多个值
- javascript - 如何迭代和比较 JS 对象中的值?
- python - 如何将调用日志记录的子模块名称写入日志而不是存储记录器的位置