查询和更新深层儿童 - Firebase

时间:2017-09-23 13:40:07

标签: javascript firebase firebase-realtime-database

我目前仍然坚持如何查询深层嵌套子项,然后删除这些子项。一点背景:

在我的应用中,用户发布作业。新创建的作业将发布到jobs/serviceUsers/activeJobs/usersUID

下的作业创建者

以及jobs/workerUsers/workersUID

下的工人

Database screenshot

现在发布这些工作没有问题,但是如果用户想删除它,我现在仍然坚持下去?我必须在serviceUsers下删除它(这没有问题),但也删除了workerUsers中的作业(请记住,将有许多具有相同jobID的workerUser)。所以我需要查询,查找和删除这些工作。

我目前有这个代码来找工作人员并期望它能够正常工作但没有发生任何事情:

// jobID is the job to be deleted

let queryRef = firebase.database().ref(`/jobs/workerUsers`);

queryRef.orderByChild(jobID).equalTo(true).once('value', snap => {
  console.log('successful Query: ', snap.val);
});

感谢任何帮助!

(注意:这是我第一次使用firebase)

2 个答案:

答案 0 :(得分:2)

根据您的评论,我理解的是:当用户删除作业时,您希望将其从所有工作者用户中删除。如果是这种情况,您将需要在作业下添加1个节点,例如jobs/jobWorkers,其中工作者ID将映射到作业ID(如Haressh所建议的那样)。

所以你的最终结构将是:

jobs/serviceUsers/activeJobs/usersUID/jobId/{job details} - 活动作业列表(如果我理解正确,它将具有特定用户创建的作业详细信息)

jobs/workerUsers/workersUID/jobId - 这将映射特定用户(工作人员)正在处理的不同作业(此处未存储作业详细信息)

jobs/jobWorkers/jobId/workersUID - 这将映射从事特定工作的不同工作人员(此处未存储工作详情)

当用户尝试删除作业(由他创建)时,首先让工作人员从jobs/jobWorkers/jobId开始工作,迭代这些工作人员ID并从jobs/workerUsers/<workerUID>/jobId中删除作业ID。然后删除完整节点@ jobs/jobWorkers/jobId。最后删除将删除作业详细信息的完整节点@ jobs/serviceUsers/activeJobs/usersUID/jobId

是的,这里有一些数据重复。但这很正常。 (欢迎使用Firebase,欢迎来到NoSql DB :))

如果您尚未完成此操作,请阅读此内容:https://firebase.google.com/docs/database/ios/structure-data

答案 1 :(得分:1)

我没有正确理解您的问题,我理解用户在jobs/serviceUsers/activeJobs/usersUID下创建的工作看起来没问题,

但是当您在jobs/workerUsers/workersUID下创建相同内容时,您需要这样的内容jobs/workerUsers/jobID/usersUID

然后你可以这样删除它 firebase.database().ref("/jobs/workerUsers/"+jobID+"/"+usersUID).remove();