簡體   English   中英

MongoDB:您能否將一個集合作為字段包含在另一個集合的文檔中?

[英]MongoDB: Can you include a collection as a field in a document of another collection?

我正在使用 Javascript、Node.js、Express 和 MongoDB 來制作 Web 應用程序。 在應用程序中,您可以使用字段名稱和姓氏創建一個帳戶,但我還想要一個跟蹤已完成步驟的字段(布爾值:如果未完成,則為 false,如果已完成,則為 true)。 不可能將步驟硬編碼為單獨的 boolean 字段,因為我想讓步驟列表可調。 所以我正在考慮制作另一個包含所有步驟名稱的集合(=progress),您可以在其中添加一些,並且知道我正在尋找一種方法來為我創建的每個帳戶包含這些 boolean 步驟。

我認為 MongoDB 集合模式的草圖應該如下所示:

帳戶
- 名稱(字符串)
- 姓氏(字符串)
- 進步:
- stepName (String), completed (boolean)
- stepName (String), completed (boolean)
- stepName (String), completed (boolean)
-...

進步
- 步驟名稱(字符串)
- 完成(布爾)

提前謝謝了

你可以 - 因為看起來你正在使用 Mongoose,你可以看到https://mongoosejs.com/docs/subdocs.html在這里概述了一些關於如何執行類似操作的信息。

但是,根據我做類似事情的經驗(通過流程跟蹤進度),我建議進行一些不同的設置。 我看到的最大問題是,如果您添加一個新步驟,您不想通過 go 並更新每個account文檔以將新步驟放入其progress字段。 或者類似地,如果您決定刪除一個步驟,您不希望必須對每個帳戶 go 並從其進度字段中刪除該步驟的條目。

我不會將其視為在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 ,您將需要一個 map( https://mongoosejs.com/docs/schematypes.html#maps )顯示每個步驟的進度(完成 Z9ED39E2EA931586B73A985A6942):EZEF

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

這意味着每當您檢查帳戶的進度時,您都需要遍歷step集合中的文檔(根據position字段排序),並檢查該帳戶的progress map 針對每個步驟 id 以查看是否有沒有完成。 雖然這聽起來像是額外的工作,但這種方法有很多優點。 這意味着如果您決定在step集合中添加、刪除或重新排序步驟,則無需 go 對每個現有的account文檔進行相同的更改以匹配 - 您只需在下一個自動選擇更改檢查帳戶progress字段的時間。

進一步說明 - 我建議您設置架構的方式,而不是為每個未完成的步驟設置明確的false值,大多數時候您在 map 中沒有任何未完成的值腳步。 在您的代碼中,您可以輕松地將任何缺少的步驟進度值視為錯誤( if (.account.progress.firstStep) {默認情況下與 javascript 一起使用)。 如果需要,這還為您提供了選項,即僅在向用戶呈現該步驟時將步驟的進度設置為顯式false 因此,您可以更輕松地了解他們停止的步驟(即使您稍后更改步驟的順序)和/或他們是否跳過了任何步驟(如果某些步驟被認為是可選的),而不僅僅是能夠看到哪個步驟已完成。

您所描述的稱為“嵌入式文檔”,並受 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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM