MongoDB Advanced Schema Design Pattern - Subset Pattern

用一句簡單的話說

只儲存子集合資料(如最近幾筆),幫助我們減小整體、經常被 fetch 的 document 大小。


場景

Book 裡的 review 只顯示前三筆,但某一本書的 review 有上萬筆,影響了讀取的效能,這時可以考慮 Subset Pattern

  1. 確保 Book 的 review 只存取前三筆
  2. 另外開一個 collection 儲存 review documents,裡面可以有成千上萬個 review documents ,但其中只有三個 review 會與 book collection 裡的 review 重複

需要額外管理 duplicate data 如何被同步更新,但因為 review 不是很常被改變,我們願意冒這個風險來讓 book 的 document size 大幅減少

需要兩個 pipeline 流程


  1. 將原本的 books 裡的 review value 備份到另一個 collection
[
{
$unwind: {
path: "$reviews"
}
},
{
$set: {
"reviews.product_id": "$product_id"
}
},
{
$replaceRoot: {
newRoot: "$reviews"
}
},
{
$out: "reviews"
}
]

  1. 確保 books 裡的 review 數量不超過三筆
const update_review_array_pipeline = [
{
$set: {
'reviews': {
'$slice': {
'reviews': 3,
}
}
}
}
]

這樣一來就完成了 subset pattern 的實踐。