【问题标题】:How to delete a specific child from a child in Firebase如何从 Firebase 中的孩子中删除特定的孩子
【发布时间】:2017-09-11 02:11:18
【问题描述】:

我有一个应用程序,用户可以在其中创建列表。

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

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

所以一个场景是:

  • 用户 A 创建一个 pushID = 1 的列表。
  • 此列表已添加到以下 Firebase 引用中:/userList/$userAID/$pushID。
  • 用户 A 与用户 B 和用户 C 共享列表。
  • 此列表已添加到以下 Firebase 引用中:/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 相同的那些,然后执行它。

【问题讨论】:

  • 我正在寻找类似的东西:firebase.database().ref('userList').child().child(uid).remove();我知道 child() 不能为空。但类似的事情

标签: javascript firebase firebase-realtime-database


【解决方案1】:

无法根据 Firebase 数据库的条件在服务器端删除多个项目。您必须首先检索符合条件的项目(或仅检索其 ID),然后删除它们。

但是,您可以使用多路径更新一次性删除列表本身以及对其的所有引用。

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

更多请看:

【讨论】:

  • 是的,最后我认为最好的方法是记录所有用户共享列表并删除该循环。但是您认为最佳实践是什么……使用 milti-path 更新或拥有与您共享的所有用户的列表然后循环?
  • 这两者通常是齐头并进的:您从数据库中读取位置/键的列表,循环它以构建要更新的路径集合,然后触发单个多位置更新.
猜你喜欢
  • 2018-08-27
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2020-04-07
相关资源
最近更新 更多