Firebase - 使用通配符和equalto()检索数据

时间:2018-01-27 22:30:06

标签: firebase firebase-realtime-database google-cloud-functions

我正在使用firebase数据库上的firebase函数来尝试提取数据,但我没有成功。

我要搜索的数据结构如下:

enter image description here

我想要做的事情的逻辑如下:当记录写入'jobs'集合时,我想在'status'集合中搜索availableStatus(存储为true / false)。

对于真实的记录,我需要获取存储在同一“status”集合中的推送ID('__zone_symbol__value')。

在我追踪的数据路径中,有两个我不知道的项目,需要使用通配符{time}和{uId}。

这是我正在使用的代码:

exports.notifyPeople = functions.database.ref('/jobs/{uId}/status')
    .onWrite(event => {
      var dbRead = admin.database().ref('status/worker/{time}/{uId}/pushToken').orderByChild('availableStatus').equalTo('true').on("child_added", function(snapshot) {
          console.log(snapshot.val());
        });

          const getPushTokens = dbRead.child;
      }

我做错了什么?

1 个答案:

答案 0 :(得分:1)

虽然可以在云函数中使用functions.database.ref('/jobs/{uId}/status')来确定函数将触发的路径,但在此处从数据库中读取时,它不能用作通配符:admin.database().ref('status/worker/{time}/{uId}/pushToken')

您必须知道要阅读的timeuId并使用它们:

let time = ...;
let uId = ...;
admin.database().ref(`status/worker/${time}/${uId}/pushToken`)

或者你必须阅读所有工人的所有信息:

admin.database().ref("status/worker");

如果这意味着您正在阅读太多数据,请考虑向JSON添加其他数据,以使此查找更有效。例如,如果为availableStatus设置为true的节点保留令牌列表,则查找可以非常简单。有关其他示例,请参阅我的答案:Firebase Query Double Nested