我有一个用户可以创建列表的应用程序。
用户可以与其他用户共享列表。我已经设法创建共享部分,我遇到的问题是删除部分。我希望当用户删除共享列表时,该列表也会从其他用户中删除。
此删除仅由列表所有者进行。
所以场景将是:
所以在我的
所以我有这个架构:
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相等的内容,然后再进行操作。
答案 0 :(得分:4)
根据Firebase数据库的条件,无法对多个项目进行服务器端删除。您必须首先检索与条件匹配的项目(或只是它们的ID),然后删除它们。
但是,您可以通过使用多路径更新来删除列表本身以及对它的所有引用。
我还建议保留您与之共享特定列表的所有UID的列表,这样您就不必遍历所有用户。在Firebase和其他NoSQL数据库中,保持双向的多对多关系非常普遍。
了解更多信息: