03 Payload 與 Process 欄位
← 02 關聯模型 Linking Models | 回到 MongoDB 資料建模設計 | 下一篇 → 04 文件設計基礎
在使用 document 時,講師建議把欄位(field)依用途分成兩大類,設計與索引時分開看待。
兩類欄位(p.20)
Payload —— 只是拿來存與取的資料
Payload – Data we just store and retrieve
- 這類欄位的存在意義只有:存起來(store)、之後整包拿回來(retrieve)。
- 不會拿它來做 query 的過濾條件。
- 你只是先指定某個 filter 查出 document,然後把這些欄位「連著一起帶回來」;它們不需要被特別處理、不需要建索引。
Processing —— 我們會在 MongoDB 內部檢視的 metadata
Processing – metadata we examine inside MongoDB
會被 MongoDB 內部拿來運算的欄位,用途包括:
- Querying(查詢過濾)
- Aggregating(聚合)
- Filtering and Projecting(過濾與投影)
- Projecting = 挑選要回傳哪些欄位(該回傳哪些、不回傳哪些)。
- Using for workflow(做流程判斷)
- Using to implement patterns(實作設計模式,見 06 設計模式 Design Patterns)
這些欄位是「要拿來處理」的,通常需要考慮建索引(05 索引與優化)。
關鍵設計提醒(投影片底部三句話)
- Payload might be predefined, sometimes better to ignore that and add Processing fields —— payload 可能是既有、預先定義好的結構;有時候更好的做法是「不要動它」,另外額外抽出需要處理的欄位當 processing field。
- For example, existing corporate data/object models, might be used only for storage —— 例如公司既有的資料/物件模型,可能只拿來當儲存用(純 payload)。
- JSON files you want to store is Payload, fields you want to filter by are processing fields —— 你想整包存起來的 JSON 是 payload;你想拿來過濾查詢的欄位,是 processing field。
講師強調:同一份資料裡,「要拿來 query 的」和「只是要存的」應該有意識地區分成不同區塊,設計與索引才會清楚。
實戰範例:把 XML 存進 MongoDB(p.21)
情境:業務上有一批 XML 物件,需要存進 MongoDB collection。
第一個直覺(First idea):把 XML 轉成 JSON 存進去
但這樣有一堆問題:
- But only ever query a few fields —— 實際上只會查其中幾個欄位。
- Normally always want just the latest —— 通常只想要最新版本。
- XML structures are complex or dynamic —— XML 結構複雜或動態,轉換難維護。
- Need to write a reverse conversion too —— 回傳給客戶端時還要寫一套反向轉換(JSON → XML)。
結論:Conversion XML <-> JSON is not a good idea, it’s expensive and difficult(雙向轉換又貴又難)。
講師補充痛點:轉換過程要寫程式在讀寫兩端都做 XML↔JSON,維護成本高,而且轉換邏輯本身可能有問題。
最佳解(Best option)
- Extract the processing data(抽出處理用資料)—— 把查詢會用到的欄位(例如 create date 等)抽出來。
- Store processing fields in documents —— 這些 processing 欄位以一般 JSON 欄位形式存在 document 裡,可以建索引、可以查。
- Put the XML itself in a Binary (compressed) – it’s a payload field —— XML 原文整包壓縮成 Binary 存起來,當作 payload 欄位。
運作方式:
- 存入時:抽出要查的欄位當 processing field(JSON),XML 原文壓成 binary payload,一起存。
- 查詢時:用 filter 比對 processing 欄位(因為它們可查、可加索引),命中後把 binary payload 取回。
- 回傳時:MongoDB driver 或應用端把 binary 還原成 XML 給客戶端。
這樣就用最少的轉換,同時保有「可查詢」與「原文完整保存」。這正是 payload / processing 分離思路的典型應用,也呼應了 06 設計模式 Design Patterns 裡多個模式的底層邏輯。
小結
- Payload:只存與取、不拿來查、不用索引。
- Processing:拿來 query / aggregate / filter / project / 跑流程 / 實作模式,需要時要建索引。
- 設計時有意識地把兩類欄位分開,是後面文件設計與索引設計的基礎。
→ 下一篇:04 文件設計基礎