【问题标题】:Firebase Realtime Database search returns the parentFirebase 实时数据库搜索返回父级
【发布时间】:2018-06-30 05:42:31
【问题描述】:

我已经创建了这样的数据,

device
    [random ID]
         id: "435345"
         token: "homer"
    [random ID]
         id: "594935"
         token: "marge"

我使用以下代码通过“token”查找“id”。

const db = admin.database().ref("device");
db.orderByChild("token").equalTo(token).once("value",
    function(data){
        console.log("key= " + data.key + " ,value= " + data.val());
     }
)

如果token 是“marge”,我希望data.val() 是“594935”。但是当我运行代码的时候,结果是这样的,

info: key= device ,value= [object Object]

我认为data 不是“设备”的第二个孩子,而是“设备”节点本身。代码有什么问题?

【问题讨论】:

    标签: firebase-realtime-database


    【解决方案1】:

    您必须循环访问列表的子值

    即使查询只有一个匹配项,快照仍然是一个列表;它只包含一个项目。要访问该项目,您需要遍历结果

    您可以阅读更多关于它的信息here

    因此,您的代码应如下所示:

    const db = admin.database().ref("device");
    db.orderByChild("token").equalTo(token).once("value", function(data_snapshot) {
    
    data_snapshot.forEach(function(data_child) {
    
    console.log(data_child.val());
    
    });
    
    });
    

    【讨论】:

    • Type[Java]Script 文档总是很糟糕,我认为。 IDE 没有显示forEach 的任何描述,我唯一能做的就是按 F12 查看签名。该参数似乎是一个返回布尔值的 lambda。所以我添加了return false;。另外,data_child 仍然是容器,所以我使用了data_child.val().id。另外,我只需要一个(并且应该有)“id”作为令牌,所以我在equalToonce 之间添加了limitToFirst(1)。我不确定这是否是最好的方法,但根据名字猜测,我认为它会做我期望做的事情。
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2021-10-07
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多