node.js - endAt 尝试从末尾再次搜索时如何停止?
问题描述
在 Firebase RealtimeDatabase 中使用 endAt() 时我被卡住了。我的结果中出现了一些不正确的值。这是我的代码:
resuftObj = await messagesRef
.child("test")
.orderByChild("country")
.endAt("ja", "9")
.limitToLast(4)
.once("value");
这是我的示例数据或视图:
|-test:
|---1:{ "country" : "us", "id" : 1 },
|---2:{ "country" : "ja", "id " : 2 },
|---3:{ "country" : "ca", "id" : 3 },
|---4:{ "country" : "uk", "id" : 4 },
| ---5:{ "国家" : "我们", "id" : 5 },
|---6:{ "国家" : "ca", "id" : 6 },
|---7:{ “国家”:“英国”,“id”:7 },
|---8:{“国家”:“ja”,“id”:8 },
|---9:{“国家”:“我们", "身份证" : 9 }
我希望返回带有“country”=“ja”的对象。但我看到两个值 3 和 6(“country”=“ca”)。我的想法是,当它达到 id=2 时,我的 Query 找不到更多结果,所以从最后(id=9)重新搜索。如何防止这种情况?
结果:
{
"2": {
"country": "ja",
"id": 2
},
"3": {
"country": "ca",
"id": 3
},
"6": {
"country": "ca",
"id": 6
},
"8": {
"country": "ja",
"id": 8
}
}
解决方案
要进一步将结果限制为仅country
等于的结果ja
,您还必须指定startAt("ja")
:
ref.orderByChild("country")
.startAt("ja")
.endAt("ja", "9")
.limitToLast(4)
还可以在这里查看我的复制:https ://jsbin.com/fajegol/edit?js,console
更新:更容易看出为什么你会ca
以正确的顺序打印结果(我最初没有这样做):
ref.orderByChild("country")
.endAt("ja", "8")
.limitToLast(4)
.once("value", function(snapshot) {
snapshot.forEach(function(child) {
console.log(child.val());
})
});
给出这个输出:
{“国家”:“ca”,“id”:3}
{“国家”:“ca”,“id”:6}
{“国家”:“ja”,“id”:2}
{“国家”:“ja”,“id”:8}
这样就更有意义了:子节点是按顺序排列的country
,这是您告诉它的节点之前的最后 4 个节点endAt()
。
您问题中的输出来自 logging snapshot.val()
,它为您提供没有您请求的顺序的结果(因为 JSON 中的键根据定义是无序的)。
推荐阅读
- javascript - 我可以集成任何很酷的工作流构建器工具吗?
- java - 无法从 JDBC 连接到 MySQL 数据库,但 MySQLWorkbench 很好
- r - 设置当前用户的路径
- php - Laravel - 如何调用模型类助手然后在视图中显示结果
- excel - 使 LastRow 成为整数的下标超出范围错误
- python - 如何只保留包含特定值的连续数字
- azure-devops - 如何在 MAC 中配置 VSTS-agent?
- c++ - 指针转换是否保持对齐属性?
- linux - Linux命令验证每台机器连接的是哪个交换机
- playframework - 玩 2.3 WS keystore 配置