如何使用Firebase云功能在DataSnapshot中查找特定值

Elh*_*oej 6 javascript firebase firebase-realtime-database google-cloud-functions

我正在尝试创建一个将在HTTP请求(在计时器上发送)上触发的云功能,这将删除具有特定值的所有子项.

数据库节点如下所示:

activities
    4GI1QXUJG0MeQ8Bq19WOdCQFo9r1 //uid
        activity: "hammer"
        id: some ID
        note: "some note"
        timestamp: some timeintervalsince1970
    7IDUiufhiws8939hdfIUHiuhwdi5
        etc....
Run Code Online (Sandbox Code Playgroud)

我想查看所有活动,如果活动值是"锤子",我想删除孩子.

这就是我到目前为止所拥有的

exports.deleteHammerNotifications = functions.https.onRequest((req, res) => {

    admin.database().ref('activities').once('value', (snapshot) => {

        console.log(snapshot.val())

    });
});
Run Code Online (Sandbox Code Playgroud)

打印:

{ 
    '4GI1QXUJG0MeQ8Bq19WOdCQFo9r1': 
      { activity: 'nn',
        id: '4GI1QXUJG0MeQ8Bq19WOdCQFo9r1',
        note: 'Blank note...',
        timestamp: 1498032472 },
     M6xQU5XWTEVbSqBnR3HBAEhA9hI3: 
      { activity: 'hammer',
      id: 'M6xQU5XWTEVbSqBnR3HBAEhA9hI3',
      note: 'some note here...',
      timestamp: 1497973839 },
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何循环访问DataSnapshot并查找具有该活动的所有子项:"hammer"值.我在我的xcode项目中使用数组做了类似的功能,但我不知道如何使用JavaScript.

任何帮助表示赞赏!

Fra*_*len 5

要遍历匹配的子节点,请使用snapshot.forEach():

exports.deleteHammerNotifications = functions.https.onRequest((req, res) => {
    admin.database().ref('activities').once('value', (snapshot) => {
      snapshot.forEach((childSnapshot) => {
        console.log(childSnapshot.val())
      });
    });
});
Run Code Online (Sandbox Code Playgroud)

但是你仍然缺少一个查询来选择正确的节点.没有这样的查询你也可以打电话admin.database().ref('activities').remove().

为了最有效地从数据库中删除多个项目并将单个响应写回用户,请使用此功能(我最近根据需要修改了该功能):

exports.cleanup = functions.https.onRequest((req, res) => {
  var query = admin.database().ref("activities").orderByChild("activity").equalTo("hammer");
  query.once("value").then((snapshot) => {
    console.log("cleanup: "+snapshot.numChildren()+" activities");
    var updates = {};
    snapshot.forEach((child) => {
      updates["activities/"+child.key] = null;
    });
    admin.database().ref().update(updates).then(() => {
      res.status(200).send(snapshot.numChildren()+" activities deleted");
    }).catch((error) => {
      res.status(500).send(error);
    })
  });
});
Run Code Online (Sandbox Code Playgroud)

学到更多: