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)

  1. Extract the processing data(抽出處理用資料)—— 把查詢會用到的欄位(例如 create date 等)抽出來。
  2. Store processing fields in documents —— 這些 processing 欄位以一般 JSON 欄位形式存在 document 裡,可以建索引、可以查。
  3. 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 文件設計基礎