为了账号安全,请及时绑定邮箱和手机立即绑定

如何过滤和检索 Firebase 实时数据库中的嵌套子项?

如何过滤和检索 Firebase 实时数据库中的嵌套子项?

慕森王 2021-09-04 17:24:24
这是我正在使用的数据库结构的简化版本:  "user" : {    "nhbAQ9p8BrMoAIbJNKvLlXTdiNz2" : {      "log" : {        "-LhMVugmjmIdqwrJSURp" : {          "a" : 25120,          "timeStamp" : 1560312000000,        },        "-Lh_Z9GsJJvlMOpVV9jU" : {          "a" : 19033,          "timeStamp" : 1564718400000,        }      }    }  }我在使用给定的用户 ID(例如 nhbAQ9p8BrMoAIbJNKvLlXTdiNz2)和时间戳(例如1560312000000)过滤和检索“a”的值时遇到问题。我已经尝试了orderByChild(),equalTo()和 添加once()侦听器的组合来完成任务,但null到目前为止它们才返回。我拥有的代码:firebase.database().ref('user/' + userID + + '/log').orderByChild('timeStamp').equalTo(targetTimeStamp).once('value').then(function(snapshot){    let userLog = snapshot.val().a})其中userID是一个字符串,targetTimeStamp是一个数字。我检查了DOC和岗位约orderByChild(),但我仍然不知道是什么原因导致它返回null。这是我第一次发布问题,如果有任何我可以更清楚地说明问题,请发表评论,非常感谢任何帮助!
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

其中userID和targetTimeStamp都是字符串。


这就是什么都没有返回的原因。在数据库中,timeStamp属性的值是一个数字,将数字与字符串进行比较永远不会返回匹配项。


要使查询工作,请将字符串转换为数字:


...equalTo(parseInt(targetTimeStamp)).once(...

除此之外,针对 Firebase 数据库的查询可能有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。


所以你也需要处理这种情况:


firebase.database().ref('user/' + userID + + '/log').orderByChild('timeStamp').equalTo(targetTimeStamp).once('value').then(function(results){

    results.forEach(function(snapshot) {

        let userLog = snapshot.val().a

    })

})


查看完整回答
反对 回复 2021-09-04
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信