【问题标题】:Should I save this in the same user collection or create another collection?我应该将其保存在同一个用户集合中还是创建另一个集合?
【发布时间】:2021-08-23 06:23:05
【问题描述】:

我正在使用 reactjs 和 firebase firestore 创建这个项目,用户可以在其中注册和登录该网站。登录后,用户将拥有一个存储其用户 ID 的二维码。在管理员方面,管理员可以扫描他们的二维码,然后检索用户的用户 ID。然后,管理员可以查看用户的信息,例如他们的姓名、出生日期、地址和电话号码。并且还可以输入用户的疫苗是什么和接种疫苗的人等等,然后提交。

我不确定当管理员提交用户输入的疫苗接种状态时是否应该创建另一个集合,或者我是否应该仍然将其保存在用户集合中。

这是用户集合:

我之所以这么问,是因为我将为至少接种 1 剂疫苗或完全接种疫苗的人创建每个疫苗的月度图表。如果我只是通过创建另一个集合将它保存在 firestore 中,或者只是将它保存在用户集合中,这会好吗?

月度图表类似于这样:

这是管理员可以输入用户疫苗接种信息的表格。管理员将输入用户接种的疫苗类型,无论从我的位置如何,人们都无法选择他们将获得哪种类型的疫苗。

【问题讨论】:

  • 会话是什么样的,单个用户可以拥有多少个会话?
  • 我指的会话是用户的疫苗会话。我为管理员创建了 1 个表单来更新用户的疫苗接种信息
  • 因此,如果每个用户只能服用 2 剂,您可以将详细信息存储在同一用户文档中的地图中吗? {..restFields, doses: {first: {...}, second: {...}}}
  • 所以我可以将它保存在同一个用户集合中,对吗?它不会导致图表出现问题吗?我只需要用户where() 或其他什么?
  • 你能指定你需要什么样的查询吗?可以在这里写吗?要在嵌套对象上使用 where 查询,您可以使用点表示法。 .where("doses.first.type", "==", "AstraZeneca")

标签: reactjs firebase google-cloud-firestore graph


【解决方案1】:

如果每个用户最多可以服用 2 剂,您可以简单地将数据作为地图存储在用户的文档中。

{
  firstName: "name",
  ...otherFields,
  doses: {
    1: {
      ...dose1Info
    },
    2: {
      ...dose2Info
    }
  }
}

然后您可以使用dot notation 使用这些嵌套字段进行查询,如下所示:

const query = colRef.where("doses.1.type", "==", "AstraZeneca")

此查询将返回第一个是 AstraZeneca 的用户的文档。同样,您可以根据其他剂量信息字段进行查询。

【讨论】:

  • 有一个问题,我应该为每剂疫苗保存什么日期格式,因为我还要每月制作一张图表?
  • @AranyaDream 您可以使用 Firestore 时间戳或仅使用时间戳 Date.now()。它们都应该工作得一样好。
  • 哦,好吧。谢谢
【解决方案2】:

虽然@Dharmaraj 回答会起作用,但您也可以考虑另一种解决方案,如下所示:

Firestore-root
  |
  --- users (collection)
       |
       --- $uid (document)
            |
            --- vaccinType: "AstraZeneca"
            |
            --- doseOne: true
            |
            --- doseTwo: true

要查找所有接种过“阿斯利康”疫苗的用户,您可以使用以下查询:

const query = usersRef.where("vaccinType", "==", "AstraZeneca")

要查找所有接种过“阿斯利康”疫苗并接种第一剂疫苗的用户,只需使用:

const query = usersRef.where("vaccinType", "==", "AstraZeneca")
                  .where("doseOne", "==", true)

要查找所有接种过“阿斯利康”疫苗并接种了您可以使用的第一剂和第二剂的用户:

const query = usersRef.where("vaccinType", "==", "AstraZeneca")
                  .where("doseOne", "==", true)
                  .where("doseTwo", "==", true)

如果您需要额外的剂量数据,您可以为此创建两个单独的字段。

【讨论】:

  • 谢谢。我只是想澄清一下,管理员在表单中输入的疫苗信息将存储在另一个集合中,这个集合是您上面发布的用户集合下的$uid (document)
  • 如果管理员输入的疫苗信息只对应一个用户,那么是的,您应该将该信息存储在用户对象下(同一个文档)。这样,您只需阅读单个文档即可获得正确的信息。
  • 是的,管理员只会编辑每个用户的信息。管理员必须扫描用户的二维码,然后管理员才能输入疫苗信息
  • 最好的解决方案是将该信息保存在用户文档中。
  • 我投了赞成票。谢谢你的建议
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2020-05-01
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多