您可以 -- 因为您似乎在使用 Mongoose,您可以查看 https://mongoosejs.com/docs/subdocs.html 以获取有关如何执行您在此处概述的操作的一些信息。
但是,根据我做类似事情的经验(通过流程跟踪进度),我建议进行一些不同的设置。我看到的最大问题是,如果您添加一个新步骤,您不希望必须遍历并更新每个 account 文档以将新步骤放入其 progress 字段。或者类似地,如果您决定删除一个步骤,您不希望必须转到每个帐户并从其进度字段中删除该步骤的条目。
与其认为它在account 集合的每个文档中都包含progress 集合,不如将其视为具有一个包含有关每个步骤的任何可调整/可配置数据的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 字段排序),并检查该帐户的 progress 映射每个步骤 id 以查看是否有任何未完成的步骤。虽然这听起来像是额外的工作,但这种方法有很多优点。这意味着如果您决定在 step 集合中添加、删除或重新排序步骤,则无需对每个现有的 account 文档进行相同的更改以匹配 - 您只需自动选择下次您检查帐户的progress 字段时进行更改。
还有一点需要注意——我建议您设置架构的方式,而不是为每个未完成的步骤设置明确的 false 值,大多数情况下您只是没有任何价值在地图中查看未完成的步骤。在您的代码中,您可以轻松地将任何缺少的步骤进度值视为错误(if (!account.progress.firstStep) { 默认使用 javascript)。如果需要,这还为您提供了选项,即仅在向用户呈现该步骤时将步骤的进度显式设置为 false。因此,您可以更轻松地了解他们停止的步骤(即使您稍后更改步骤的顺序)和/或他们是否跳过了任何步骤(如果某些步骤被认为是可选的),而不仅仅是能够看到哪个步骤已完成。