MongoDB:您可以将一个集合作为字段包含在另一个集合的文档中吗?

时间:2020-05-21 15:46:55

标签: javascript node.js mongodb express mongoose

我正在使用Javascript,Node.js,Express和MongoDB制作Web应用程序。在应用程序中,您可以使用字段名和姓氏来创建一个帐户,但是我还想要一个跟踪已完成步骤的字段(布尔值:如果未完成,则为false;如果已完成,则为true)。将步骤硬编码为单独的布尔字段是不可能的,因为我想使步骤列表可调。因此,我正在考虑使用步骤名称以及您可以在其中添加一些步骤名称的另一个集合(= progress),并且知道我正在寻找一种方法来为我创建的每个帐户包括这些布尔步骤。

我认为MongoDB集合模式应该是这样的草图:

帐户
-名称(字符串)
-姓(字符串)
-进度:
-stepName(字符串),已完成(布尔值)
-stepName(字符串),已完成(布尔值)
-stepName(字符串),已完成(布尔值)
-...

进度
-stepName(字符串)
-已完成(布尔值)

提前非常感谢

2 个答案:

答案 0 :(得分:1)

您可以-因为看起来您正在使用猫鼬,所以您可以在https://mongoosejs.com/docs/subdocs.html上找到一些有关如何执行类似您在此处概述的操作的信息。

但是,根据我做类似事情的经验(通过流程跟踪进度),我建议将事情设置得有些不同。我看到的最大问题是,如果添加一个新步骤,则不需要遍历并更新每个account文档以将该新步骤放入其progress字段中。同样,如果您决定删除某个步骤,则不必转到每个帐户并从其进度字段中删除该步骤的条目。

我不认为它包含在progress集合的每个文档中的account集合,而是认为它具有一个step集合,其中包含任何可调整/可配置的数据关于每个步骤。那里没有completed字段,因为这是每个帐户专用的。根据您的需求,我建议如下所示:

step
    - id (String) -- something that will never change
    - name (String) -- a user-facing name that you might want to change later
    - position (number) -- used to control the order of steps presented to the user
    - ... other things, depending on what you need/want

现在,对于account,您将需要一张显示进度(每个步骤的完成状态)的地图(https://mongoosejs.com/docs/schematypes.html#maps):

account
  - name (String)
  - lastname (String)
  - progress: (Map of boolean)
      - key: step id
      - value: boolean showing whether it has been completed
  - ...

这意味着您每次查看帐户进度时,都希望遍历step集合中的文档(根据position字段排序),并检查该帐户的{ {1}}映射每个步骤ID,以查看是否有未完成的步骤。尽管这听起来像是额外的工作,但是这种方法有很多优点。这意味着,如果您决定添加,删除或重新排序progress集合中的某个步骤,则无需对每个现有step文档进行相同的更改即可匹配-您将下次您检查帐户的account字段时,系统会自动提取更改。

还有一点需要注意的-我建议您设置模式,而不是为大多数未完成的步骤提供一个明确的progress值,映射中任何未完成步骤的值。在您的代码中,您可以轻松地将所有缺少的步骤进度值与false相同(默认情况下,false在javascript中有效)。如果需要的话,这也使您可以选择仅在向用户展示该步骤时才将其进度设置为显式if (!account.progress.firstStep) {。因此,您可以更轻松地了解它们停止了什么步骤(即使您以后更改了步骤的顺序)和/或它们是否跳过了任何步骤(如果某些步骤被认为是可选的),而不是只能查看哪个步骤步骤已经完成。

答案 1 :(得分:0)

您描述的内容称为“嵌入式文档”,并且受mongodb支持。

Mongodb文档包含您想要的示例:

{
   ...
   name: { first: "Alan", last: "Turing" },
   contact: { phone: { type: "cell", number: "111-222-3333" } },
   ...
}

在mongodb中,可以通过以下方式访问:

"<embedded document>.<field>"

来源:https://docs.mongodb.com/manual/core/document/