API 測試相關文章可以參考以下連結:
Postman 發展至今已經是很強大的 API 測試工具,早期為單純的 API 測試,接著陸續加入了腳本、整合多個測試、個人同步、團隊協作甚至是開發 API 與 Mock server(模擬伺服器),讓你不需要熟稔程式也能開發自己的 API。
前置作業
- 到 Postman官網 下載並安裝好 Postman
- 選擇以下任一個 API 測試網站,挑一個覺得順眼的就可以了
接下來我們練習的 API 會直接打到這些網站之一的接口
API 測試相關文章可以參考以下連結:
Postman 發展至今已經是很強大的 API 測試工具,早期為單純的 API 測試,接著陸續加入了腳本、整合多個測試、個人同步、團隊協作甚至是開發 API 與 Mock server(模擬伺服器),讓你不需要熟稔程式也能開發自己的 API。
接下來我們練習的 API 會直接打到這些網站之一的接口
MongoDB, out, merge
本篇接續 MongoDB $out 教學,介紹的是 $out
語法的進階版本 $merge
,客製化程度更高了,能夠處理衝突時該使用覆蓋還是略過等。
$merge
僅能在 aggregation pipeline 中使用,且必須是最後一個執行的階段,也就是說在前面可以執行任何的資料篩選、操作和轉型,最終輸入到目的地。
1 | { $merge: { |
從上述語法上可以得知
into
就是匯入的集合on
指定唯一的欄位,用來做文件比對是否相符,以進行 whenMatched
或 whenNotMatched
動作,可以是一個或多個欄位let
可以讓使用者自定義的變數 $$xxx
whenMatched
當遇到衝突時該..whenNotMatched
2021 年是個改變很多的一年,疫情關係迎來了這份工作第一次 WFH,剛開始生活與工作平衡拿捏不是很好,工時不知不覺就多了很多,畢竟是隨時隨地都能夠自由工作的狀態,是一個很好的學習體驗。
至於改變很多,指的是踏出工作上的舒適圈,雖然我對外人的說法總是開玩笑地說「中年危機,中年危機啦!」,一部分來說是事實,主要原因還是來自些許的憤怒,社會走跳,要讓人信服需要各種程度的「砍讚」,即便是再小的事情也一樣,氣的部分是不夠被信任,即使是對的也不被接受,氣別人不如氣自己,那麼我就更加努力地去鑽研,直到夠格為止。
我生性健忘,想到了之前荒廢已久的部落格,興起念頭開始邊讀文件邊實作並記錄在部落格上;適逢 iThome鐵人賽
,燃起參加的念頭,但在這個時刻,突然驚覺原來阻礙我的念頭是擔心程度不足而丟臉。這是一個很糟糕的想法,有的人是完美主義,有的人是害怕失敗,但這些都不應該存在的,我的理念就是不去嘗試,狀況永遠不會改變,沒有人是完美準備好才上陣的。
從踏出舒適圈開始,這段旅程讓我學到了非常多,也養成了學習的習慣,雖然在「年紀」的因素下,做任何事情都是時間的投資,成功與效益就變得格外重要,我不能否認這個看法,卻也搞得壓力很大。很多學習不見得是當下用得到,你也不會知道未來何時用得到,甚至是額外的益處也預料不到。
結果來看,還是沒有得到認可,說不失望是假的,但也代表做得不夠好、還有進步空間。
立了下一年度的目標,繼續迎戰!
建議搭配第二篇 MongoDB 索引的 ESR 規則詳解 一起閱讀
我原本以為對官方來說這是一個很基本的查詢通則,沒想到在 MongoDB Manual 搜尋不到相關的文獻,只有在官方 blog 的 Performance Best Practices: Indexing 這篇文章有介紹到 ESR 規則,讓我有點意外。
ESR(Equality, Sort, Range) 意思是指查詢條件與 Index 必須按照這個順序來安排,才能夠達到最佳的效能。
{$eq}
.sort({ })
{$gte:{ }}
基本上你有使用 Index 就要這樣做,也就是都要這樣做。
假設你的查詢條件沒有排序,那就可以跳過 sort
階段。
假設你的查詢條件有排序,那 sort
必須緊跟在前一個 equality
階段。
例如有一把 index {a:1, b:1, c:1}
NVM 顧名思義就是 Node Version Manager
,會寫這篇文章也是因為升版本 NodeJS 後,Hexo 反而不支援相關功能,於是需要降版本來使用相關功能。特別來補一下,怕之後忘記怎麼處理。
curl nvm!
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
1 | ➜ source git:(master) ✗ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash |
設定執行檔
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"
TypeError [ERR_INVALID_ARG_TYPE]: The “mode” argument must be integer. Received an instance of Object
今天一如往常修改了一些 blog 內容後準備發布,發現怎麼遲遲未更新,回去看 terminal 才發現這個錯誤。
TypeError [ERR_INVALID_ARG_TYPE]: The "mode" argument must be integer. Received an instance of Object
完整資訊如下:
1 | 上略 |
之後才熊熊想到 nodeJS
版本升級了,上網一查果然沒錯!!
1 | ➜ source git:(master) ✗ hexo -v |
我升級的是 nodeJS 17.2
版本,目前 hexo 並不支援啊~~
要使用 nvm
來降版本,降到 nodeJS 13
版本之後就能順利部署了!!
include lower bound, exclude upper bound
,例如:中文叫做高的基數,剛開始也是一知半解。
簡單來說就是該欄位必須範圍夠廣,因為 shard 數量是依照 shard key 進行分配與產生的,最大上限就是 shard key 的範圍。
例如我們選擇 洲(continent)
當作 shard key,那麼 shard 數量不能超過 7
個,因為地球就只有七個大洲。這當然不會是一個好的 shard key。
這邊說的是 shard key 欄位的分布狀況,假設用台灣各個城市當作 shard key 就不是很好,因為大部分人會集中在北部,尤其台北市與新北市,這樣 shard 資料量分佈就會很不均衡。
不要選用單純遞增或遞減的欄位作為 shard key,例如日期或者遞增的 sequence number。
因為 shard key 是有上下限的設計,最高為 max
,最低為 min
。假設選用遞增數字來當 shard key,新的資料進來永遠都會位在 最大的 shard。
因為這次內容比較多,就減少文字的描述了,直接上乾貨(X),直接上範例與結果。
測試資料
1 | db.arraycollection.insert({fruits:['apple', 'guava', 'orange', 'watermelon', 'pitaya', 'durian']}) |
1 | > db.arraycollection.find({fruits: [ "apple", "guava", "orange", "watermelon", "pitaya" ] } ) |
給予一陣列進行查詢,都要符合才找得到
1 | > db.arraycollection.find({fruits:{$all:['apple']}}) |
MongoDB, out, merge
在 SQL 當中我們很常使用 INSERT INTO SELECT
語法,查詢後直接寫到新的 table。很慶幸的是 MQL 也同樣支援這個語法,就是 aggregation 內的 out
!
關於 out
,是比較早推出的版本(2.6),後面有推出新的語法叫做 merge
,是更進階與細節的語法。out
可視為較陽春的版本,如果沒複雜操作,使用 out
即可,之後再做 merge
的說明。
1 | { $out: { db: "<output-db>", coll: "<output-collection>" } } |
out
語法僅有兩個參數,db
與 coll
,分別是要輸出的資料庫以及集合。
out
僅能在 aggregation pipeline 中使用,且必須是最後一個執行的階段,也就是說在前面可以執行任何的資料篩選、操作和轉型,最終輸入到目的地。
另外要補充的是,如果目的地已經有資料,會無條件直接覆蓋