建議搭配第一篇 MongoDB 不懂 ESR 別說你會用 Index !! 一起閱讀


我們建立 MongoDB 索引時需要掌握 ESR 原則,所謂的 ESR 代表的是 E(quality)、S(ort)、R(Range),也就是説,索引欄位順序必須是這個順序,才能達到最佳效能。

這是一個大原則,相同類型的欄位可以重複,例如:

  • EESR (O)
  • ESRR (O)
  • ER (O)
  • EER (O)
  • ESER (X) 像這種違反大原則的就不符合規則

我們遵循 ESR 規則的原因是使得每次查詢都能夠以最少的 KEY 掃描次數就能找到文件為目標,這樣速度會是最快的。大家可能受到 RDB 觀念影響,就很容易發生未遵照 ESR 原則的情況,這樣會使得查詢未達最佳化。

如果沒按照 ESR 規則,MongoDB 的查詢速度肯定會受到影響,其次是第一階段會使用 RAM 進行索引排序,也就是後面會提到的 sortsort_key_generator; 第二階段,一但超過記憶體使用上限,就必須使用硬碟排序,此時必需啟用 allowDisk 設定,速度會再更慢。附帶一提,MongoDB find 查詢的參數順序是沒影響的,例如 .find({ fieldA: true, fieldB: 3 }) 等同於 .find({ fieldB: 3, fieldA: true })

這邊要強調,實務上並非所有情境都需要即時得到查詢結果,例如週期性產生報表的排程作業就沒有這麼高的即時性,刻意建立相關的索引會換來寫入速度降低。

使用測試資料來演示 ESR

這邊我們先建立了五筆資料與一把索引,特別注意索引刻意先把 Range 建立在 Equality 前面。

Read more »

這篇文章將會一步一步教學從買網域開始,到修改自己 Github 網誌的網址。

網路發展至今,很多東西都大幅開放與提升,而服務也是日新月異,如今要擁有自己的網域,是一件非常簡單的事情,重點是非常便宜,何不先創立自己的品牌呢~

Step0 Prerequisite

  • 在 Github 有建立 Blog
  • 想使用自己的網域名稱

其實購買網域的用途都不一樣,只是我的用途是這個,而這篇文章純粹想紀錄比較新的版本。

Step1 購買網域

網路上有很多提供網域購買的網站服務,常見的像是 GoogleNameCheapAzureAWS,好了要講可能講不完,挑一個你覺得順眼的就對了。

只想特別提醒,有些品牌打著超低價,但是第二年的續約價錢卻拉高不少,雖然這是一種行銷手法,但個人非常不喜歡,沒注意到的人可能就上當了,畢竟域名這種東西較少說改就改,辛苦經營了一年後發現續約價格高了不少,會很不舒服。

本篇介紹的域名商是 Cloudflare,本身也能夠處理 DNS 問題,剛好滿足需求。印象之前有出了個大包,但不影響我決定就是了。

註冊後就能看到 Dashboard,依序點擊圖中的 購買網域

Read more »

寫 MQL aggregation 有一些要注意的地方,雖然蠻多部分 MongoDB 都幫你優化了,但還是要注意一下小地方,讓你的 MQL 效能更好

Case1

絕對優先使用 $match 減少資料量

$match -> $project

  • $match 過濾不必要的資料,減少記憶體與CPU消耗
  • $project 過濾不必要的欄位,同上,若你預期的結果不需要使用某些欄位時,就先移除再進行其他操作

Case2

$match -> $sort

基本上是上面的變形,先減少資料量再排序

Case4

這邊是比較少用到的狀況,但也很好理解

Read more »

MongoDB Index Intersection,索引交集


MongoDB 索引交集,初次看到這個東西覺得很神奇,查了一下是在 2.6 版本提供的新功能。

用途是一個查詢中,可以使用兩把 Index 進行協助查詢,注意,至多只能是兩把!所以你想把每個欄位都單獨建立索引,讓他能夠自由組合就錯了。

說明文件開頭也聲明:

  • 請使用 Compound Index 而非使用 Index Intersection
  • explain 上也不會優先使用它
  • 若查詢中有排序,就不能使用它

看了上述三項,應該很多情境都不會用了。


在更細去探討之前,先了解 Index。

例如我們現有一把 Index

Read more »

Environment

  • macOS Monterey
  • DotNet SDK 6.0.101
  • Rider IDE 2021.3.2
  • DotNet Core Project

升級 DotNet Core 版本後,有遇到某些專案會無法建置,錯誤如下:

NETSDK1177: Failed to sign apphost with error code 0

解法 1

  • Step1: 刪除專案底下的 obj 資料夾
  • Step2: 執行 Nuget restore

通常就可以解決了,如果還是無法,還有第二種…

解法2

直接輸入 xcode-select --install,等待安裝完畢即可

Read more »

Postman 發展至今已經是很強大的 API 測試工具,早期為單純的 API 測試,接著陸續加入了腳本、整合多個測試、個人同步、團隊協作甚至是開發 API 與 Mock server(模擬伺服器),讓你不需要熟稔程式也能開發自己的 API。


前置作業

  1. Postman官網 下載並安裝好 Postman
  2. 選擇以下任一個 API 測試網站,挑一個覺得順眼的就可以了

接下來我們練習的 API 會直接打到這些網站之一的接口


本篇會著重在介紹基本的使用。

打開 Postman 後會長這個樣子,點擊左方的 Collection,這個 Collection 像是一個測試資料夾,可以放置多個 API 測試之後,陸續執行。先來建立一個屬於這次測試的資料夾吧!

alt

Read more »

MongoDB, out, merge


本篇接續 MongoDB $out 教學,介紹的是 $out 語法的進階版本 $merge,客製化程度更高了,能夠處理衝突時該使用覆蓋還是略過等。

$merge 僅能在 aggregation pipeline 中使用,且必須是最後一個執行的階段,也就是說在前面可以執行任何的資料篩選、操作和轉型,最終輸入到目的地。

語法與參數

1
2
3
4
5
6
7
{ $merge: {
into: [collection] // 或是 { db: [db], coll: [collection] },
on: [field] // 或是 [ field1, field2 ], 指定唯一的欄位,選填參數
let: [variables], // 選填參數
whenMatched: [ replace | keepExisting | merge | fail | pipeline ], // 選填參數
whenNotMatched: [ insert | discard | fail ] // 選填參數
} }

從上述語法上可以得知

  • into 就是匯入的集合
  • on 指定唯一的欄位,用來做文件比對是否相符,以進行 whenMatchedwhenNotMatched 動作,可以是一個或多個欄位
  • let 可以讓使用者自定義的變數 $$xxx
  • whenMatched 當遇到衝突時該..
    • replace 直接取代
    • keepExisting 略過
    • merge 嘗試合併(預設選項)
    • fail 直接回傳失敗
    • pipeline 若有自定義的 user variable,就必須使用 pipeline 參數來客製整個操作細節
  • whenNotMatched
    • insert 直接寫入(預設選項)
    • discard 忽略此資料
    • fail 直接報錯

注意事項

Read more »

2021 年是個改變很多的一年,疫情關係迎來了這份工作第一次 WFH,剛開始生活與工作平衡拿捏不是很好,工時不知不覺就多了很多,畢竟是隨時隨地都能夠自由工作的狀態,是一個很好的學習體驗。

至於改變很多,指的是踏出工作上的舒適圈,雖然我對外人的說法總是開玩笑地說「中年危機,中年危機啦!」,一部分來說是事實,主要原因還是來自些許的憤怒,社會走跳,要讓人信服需要各種程度的「砍讚」,即便是再小的事情也一樣,氣的部分是不夠被信任,即使是對的也不被接受,氣別人不如氣自己,那麼我就更加努力地去鑽研,直到夠格為止。

我生性健忘,想到了之前荒廢已久的部落格,興起念頭開始邊讀文件邊實作並記錄在部落格上;適逢 iThome鐵人賽,燃起參加的念頭,但在這個時刻,突然驚覺原來阻礙我的念頭是擔心程度不足而丟臉。這是一個很糟糕的想法,有的人是完美主義,有的人是害怕失敗,但這些都不應該存在的,我的理念就是不去嘗試,狀況永遠不會改變,沒有人是完美準備好才上陣的。

  • 證照考試
  • 鐵人賽
  • 部落格

從踏出舒適圈開始,這段旅程讓我學到了非常多,也養成了學習的習慣,雖然在「年紀」的因素下,做任何事情都是時間的投資,成功與效益就變得格外重要,我不能否認這個看法,卻也搞得壓力很大。很多學習不見得是當下用得到,你也不會知道未來何時用得到,甚至是額外的益處也預料不到。

結果來看,還是沒有得到認可,說不失望是假的,但也代表做得不夠好、還有進步空間。

立了下一年度的目標,繼續迎戰!

Read more »

建議搭配第二篇 MongoDB 索引的 ESR 規則詳解 一起閱讀


我原本以為對官方來說這是一個很基本的查詢通則,沒想到在 MongoDB Manual 搜尋不到相關的文獻,只有在官方 blog 的 Performance Best Practices: Indexing 這篇文章有介紹到 ESR 規則,讓我有點意外。

ESR(Equality, Sort, Range) 意思是指查詢條件與 Index 必須按照這個順序來安排,才能夠達到最佳的效能。

  • Equality: {$eq}
  • Sort: .sort({ })
  • Range: {$gte:{ }}

什麼情況適用

基本上你有使用 Index 就要這樣做,也就是都要這樣做。

假設你的查詢條件沒有排序,那就可以跳過 sort 階段。

假設你的查詢條件有排序,那 sort 必須緊跟在前一個 equality 階段。

例如有一把 index {a:1, b:1, c:1}

Read more »

NVM 顧名思義就是 Node Version Manager,會寫這篇文章也是因為升版本 NodeJS 後,Hexo 反而不支援相關功能,於是需要降版本來使用相關功能。特別來補一下,怕之後忘記怎麼處理。

NVM Git Repository

  • Step1

curl nvm!

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

1
2
3
4
5
6
7
8
➜  source git:(master) ✗ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 14984 100 14984 0 0 51491 0 --:--:-- --:--:-- --:--:-- 51491
=> Downloading nvm from git to '/Users/mingyi/.nvm'
=> Cloning into '/Users/mingyi/.nvm'...
...
  • Step2

設定執行檔

export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

  • Step3
Read more »