首页 > 解决方案 > 使用 orderByChild() 删除 Firebase 多路径

问题描述

基本上,当用户删除他们的帐户时,我会尝试清理 RTDB 中的所有数据。

在我必须处理需要使用 orderByChild 访问它们的几个节点之前,这没有问题。这可以在原子/多路径更新中完成吗?

我试过像这样内联:

      exports.removeUserFromDatabase = functions.auth.user()
          .onDelete(function(user, context) {
              // Get the uid of the deleted user.
              var uid = user.uid;

              const deleteUserData = {};
              deleteUserData[`users/${uid}`] = null;
              deleteUserData[`feed/${uid}`] = null;
              deleteUserData[`friends/${uid}`] = null;

                //THIS IS WHERE I NEED TO USE ORDERBYCHILD() TO ACCESS NODE
                deleteUserData[admin.database().ref('/friends').orderByChild(uid)] = null;

              deleteUserData[`profileThumbs/${uid}`] = null;
              deleteUserData[`hasUnreadMsg/${uid}`] = null;
              deleteUserData[`userChatRooms/${uid}`] = null;
              deleteUserData[`userLikedPosts/${uid}`] = null;
              deleteUserData[`userLikedStrains/${uid}`] = null;
              deleteUserData[`userLikedStrains/${uid}`] = null;

              admin.database().ref().update(deleteUserData)
      });

除了我尝试使用 orderByChild() 的地方之外,所有内容都会删除。似乎没有什么(我能找到)与此有关。

我很感激这方面的一些指导!

干杯。

标签: node.jsfirebasefirebase-realtime-databasefirebase-admin

解决方案


要从 Firebase 实时数据库中删除节点,您需要知道其完整的准确路径。不支持删除查询的概念,您将条件传递给数据库的删除操作。

如果要删除/friends在某个属性中具有某个值的所有子节点,则首先需要执行查询,然后删除所有生成的子节点:

admin.database().ref('/friends').orderByChild("uid").equalTo(uid)
     .once("value").then((friendsSnapshot) => {
         friendsSnapshot.forEach((friendSnapshot) => {
             deleteUserData[`/friends/${friendSnapshot.key}`] = null;
         });
         admin.database().ref().update(deleteUserData)
     })

推荐阅读