【问题标题】:Query and Update deep child - Firebase查询和更新深层子级 - Firebase
【发布时间】:2017-09-23 13:40:07
【问题描述】:

我目前被困在如何查询深层嵌套子级然后删除这些子级。一点背景:

在我的应用中,用户发布工作。新创建的职位发布到职位创建者的下方:jobs/serviceUsers/activeJobs/usersUID

以及以下的工作人员:jobs/workerUsers/workersUID

现在发布职位没问题,但现在我被困在如果用户想删除它怎么办?我必须在 serviceUsers 下删除它(这没问题),但还要删除 workerUsers 中的作业(请记住,会有许多 workerUsers 具有相同的 jobID)。所以我需要查询、查找和删除那些作业。

我目前有这段代码可以找到工人并希望它可以工作,但什么也没发生:

// 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)

【问题讨论】:

  • serviceUsers 删除作业时,我假设您拥有usersUID。那么,在从workerUsers 删除作业时,为什么不能将它与jobID 一起使用?
  • @VivekAthalye 我有。有一个问题,那就是 JobID 嵌套在许多我不知道的 workerUsers ID 下。在屏幕截图中,您应该显示许多其他 workerUsers UID,这些 UID 可能嵌套了也可能没有嵌套的 jobID。
  • 如果你有usersUID,为什么不使用firebase.database().ref("/jobs/workerUsers/"+usersUID+"/"+jobID).remove();?它不会删除其他用户的作业。执行此操作时是否遇到任何错误?
  • @VivekAthalye 对不起,我很困惑。我没有嵌套作业的 workerUsers 的用户 ID。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

根据您的 cmets,我的理解是:当用户删除作业时,您希望将其从所有工作用户中删除。如果是这种情况,您将需要在作业下再添加 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

【讨论】:

  • 非常感谢您的回答!!!!我真的很感激并理解你的概念是什么。您做对了所有事情,但是有一个问题:允许一名工人从事一份工作,但不得超过一份。所以jobs/jobWorkers 分支不能真正存在。此外,jobs/workerUsers/workersUID/jobId/ { here are the details } 下存在实际的工作详细信息,因为当用户打开应用程序时,他会获取此工作列表,以便他可以从中进行选择。否则他需要查询作业列表对吗?
  • job/jobWorkers 将存储在给定作业 ID 上工作的所有工人 ID。所以即使One worker is allowed to work on one job and no more than one,也有多个工人在做同一份工作,对吧?另外,在那种情况下,为什么要在serviceUsersworkerUsers 下重复workersUID/jobID?那么其中一个是多余的,不是吗?
  • 不,没有多名工人从事同一项工作。从某种意义上说,它就像 uber,即 1 名乘客 - 1 名司机。 jobs/workerUsers/workersUID/jobId/{ job details } 下显示的工作不是工人正在从事的工作,而是他可以选择的工作。
  • 天哪!现在我很困惑。这是否意味着job和workerUser之间的关系是1-1?有一次你说Keep in mind there will be many workerUsers with the same jobID。然后你说workerUser's UID could be located under various JOB ID's。这给人的印象是关系是 M-N.... 为什么不详细说明您的业务用例,解释 serviceUser / job / workerUser 之间的关系,例如 1-1、1-M、M-N 以及谁在创建工作,如何他们被分配给工人等。这可能会提供一些明确性。
  • 我已经多次阅读您的第一个回复以理解它,我想我会实施它。来自 SQL,这确实是一种不同的方法。我要感谢你这么酷的回复和帮助我。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,这会起作用,但这将采用与我不同的方法。如果我遵循这种方法,那么为了向 WORKERS 显示工作,我还需要深入查询,因为 workerUser 的 UID 可能位于各种 JOB ID 下。一种或另一种方式,我需要在某处进行深入查询,这是我当前的问题。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多