查询后的 Firebase Admin 数据库快照数据?

Firebase Admin Database Snapshot Data After Query?

设置

让我们假设这是我的 JSON 数据

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

可以像这样使用管理数据库(来自 Cloud Functions)从我的数据库中检索数据

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!为什么会这样?

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

更新

当您 运行 查询 values 节点,并订阅 value event (which is what once() method does internally), you get the full value (parent key + child) of the query. To get only the child, you need subscribe to a 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