查询后的Firebase管理数据库快照数据?

时间:2017-08-07 09:01:00

标签: node.js firebase firebase-realtime-database google-cloud-functions firebase-admin

设置

让我们想象这是我的JSON数据

values: {
    a: {
        randomValue: "set",
        sorter: 1
    },
    b: {
        randomValue: "hat",
        sorter: 2
    }
}

可以使用管理数据库(来自云端功能)从我的数据库中检索数据

admin.database().ref('values/a').once('value').then(snapshot => {
    console.log(snapshot.val().randomValue + ' .. ' + snapshot.val().sorter);
});

输出 将为set .. 1

问题

只要我向我的请求附加查询,它就会停止工作,即它不像提到的in the documentation那样有效。 他们可以明确地通过查询访问snapshot.val().height

虽然当我像这样做我的查询时

admin.database().ref('values').orderByChild('sorter').equalTo(1).once('value').then(snapshot => {
    console.log(snapshot.val());
    console.log(snapshot.val().randomValue + ' .. ' + snapshot.val().sorter);
    console.log(snapshot.child('randomValue').val() + ' .. ' + snapshot.child('sorter').val());
}

输出令人惊讶是以下

a: {
    randomValue: "set",
    sorter: 1
}
undefined .. undefined
null .. null

所以snapshot.val()确实向我提供了我的完整数据,但没有一种访问方式可以为我提供任何数据,只需undefinednull!为什么会这样?

1 个答案:

答案 0 :(得分:3)

我认为在这种情况下您需要以snapshot.val().a.randomValue的形式访问这些字段。请注意,您正在针对values节点运行查询,而不是values/a节点。因此,您的结果包含a属性。

<强>更新

当您对values节点运行查询并订阅value event(内部是once()方法时)时,您将获得完整值(父键+子节点) )查询。要只获得孩子,您需要订阅child event。这就是文档中的示例。例如:

admin.database().ref('values').orderByChild('sorter').equalTo(1).once('child_added').then(snapshot => { console.log(snapshot.val()); console.log(snapshot.val().randomValue + ' .. ' + snapshot.val().sorter); console.log(snapshot.child('randomValue').val() + ' .. ' + snapshot.child('sorter').val()); });

将产生您想要获得的输出:

{ randomValue: 'set', sorter: 1 } set .. 1 set .. 1