被MongoDB用Aggregate暴打的後端小菜雞日記-day14-$facet 一次使用多個pipeline

鰻魚燒
Sep 13, 2022

--

看了這麽多天的文章,是否覺得aggregate用來搜尋資料真的很好用,其實它另一個很神奇的用法$facet,可以讓你使用同一個collection的資料,但是分別使用不同的pipeline算法,得出不同的結果出來。

Photo by Helio Dilolwa on Unsplash

例如:現在有好幾筆學生成績資料,老師認爲這次段考大家成績考的不是很理想,想要幫大家加分,但又不知道哪一種加分方式比較好,這時候就可以用$facet算出不同結果看看。

學生資料如下

老師想了幾種加分方式

  1. 大家的總分都加30分
  2. 普遍英文大家都考的比較不好,英文的分數乘上1.5
  3. 數學成績乘上1.2,英文的分數乘上1.5,讓分數更好看一點

ps.乘完分數是小數會被無條件捨去

這時可以使用以下指令做計算

$facet語法其實很簡單,後面接一個物件,key要填回傳資料的欄位名稱,value會是一個陣列,裡面寫aggregate pipeline的語法,和之前寫的都類似。

另外就是$floor這個操作符,能夠將小數無條件捨去成整數,遇到有小數的欄位需要換成整數,還蠻好用的。

最後會回傳以下資料,可以讓老師選擇要哪種加分方式比較好

ps.隔壁小王考太高分了,加分完超過總分,老師你還是選第一種加分方法(•̀ᴗ• )

--

--

鰻魚燒

剛轉職成後端工程師的小菜雞,分享自己的學習筆記