如何从Firebase

时间:2017-09-11 02:11:19

标签: javascript firebase firebase-realtime-database

我有一个用户可以创建列表的应用程序。

用户可以与其他用户共享列表。我已经设法创建共享部分,我遇到的问题是删除部分。我希望当用户删除共享列表时,该列表也会从其他用户中删除。

此删除仅由列表所有者进行。

所以场景将是:

  • 用户A使用pushID = 1创建一个List。
  • 此列表添加在以下firebase ref:/ userList / $ userAID / $ pushID。
  • 用户A与用户B和用户C共享列表。
  • 此列表添加在以下firebase ref:/ userList / $ userBID / $ pushID和/ userList / $ userCID / $ pushID。
  • 用户A删除pushID = 1的列表。

所以在我的

所以我有这个架构:

userList: {
   2xYnKcZFEdPYWfUJ3E63yQEDShe2: {
     -Kt7lXiY0Yt-oDcV38L5
   }
   KtQHkXMSwKSByZ1rmTRwjDmSYnE3: {
     -Kt7lXiY0Yt-oDcV38L5: {}
     -Kt9XP91hjwcwgcBSgbc: {}
   }
   XHpMVoRqcCdzwTP70L29Lza1ibD3: {
     -Kt7lXiY0Yt-oDcV38L5: {}
   }
}

在高级别中,这将是:

userList: {
       userID: (A) {
         -listID : (1) {}
       }
       userID: (B) {
         -listID: (1) {}
         -listID: (2) {}
       }
       userID: (C) {
         -listID: (1) {}
         -listID: (3) {}
         -listID: (4) {}
       }
    }

我必须执行此操作的当前代码如下:

const ref = firebase.database().ref('userList');
    ref.once('value')
      .then((snapshot) => {
        snapshot.forEach((childSnapshot) => {
          ref.child(childSnapshot.key)
            .once('value')
            .then((snapshot2) => {
              snapshot2.forEach((childSnapshot2) => {
                if (childSnapshot2.key === uid) {
                  ref.child(childSnapshot2.key)
                    .remove();
                }
              });
            })
            .catch(() => {
              console.log('error2');
            });
        });
      })
      .catch((error) => {
        console.log(error);
      });

我在这段代码中所做的是,首先获取userList中的所有列表,通过获取我设法跳转到userID子项的键。在这个节点内再一次我设法跳进pushID,在那里我验证检查当前的密钥是否等于我要删除的列表的UID,如果有的话,我做一个remove()。

我觉得必须有更好的方法告诉Firebase直接转到pushID并找到所有那些与我要删除的列表的UID相等的内容,然后再进行操作。

1 个答案:

答案 0 :(得分:4)

根据Firebase数据库的条件,无法对多个项目进行服务器端删除。您必须首先检索与条件匹配的项目(或只是它们的ID),然后删除它们。

但是,您可以通过使用多路径更新来删除列表本身以及对它的所有引用。

我还建议保留您与之共享特定列表的所有UID的列表,这样您就不必遍历所有用户。在Firebase和其他NoSQL数据库中,保持双向的多对多关系非常普遍。

了解更多信息: