介紹20天的Aggregation Pipeline,基本上我把大部分的常用到的stages和operators都講解過一輪了,剩下少數沒介紹到的部分,主要是實務上我沒有用過,再看官方文件的時候,覺得有點複雜、也想不太到有什麼場景可以使用到,與其硬講一個自己不熟悉的語法,我覺得不如跳過。
但是還有幾個我覺得看起來蠻有趣的語法,如果大家有興趣可以點擊連結,去官方文件看一下它的用法。
另外在使用前面介紹的語法,還有一點比較需要注意的是MongoDB版本,如果剛好專案的MongoDB版本比較舊,可能會有部分新版的語法是無法使用的,如果是個人的小型專案,升級到最新版本應該不會有太大問題,但如果是已經在運行的產品,可能就必須考慮一下升級後,是否有前後版本不相容的問題。
接下來進入正題,引用官方文件的解說,快速向大家說明一下Aggregate使用上的一些限制。
Changed in version 5.0: MongoDB 5.0 limits the number of aggregation pipeline stages allowed in a single pipeline to 1000
在使用aggregation單一個pipeline,一次最多寫入1000的pipeline stages操作,但基本上正常使用根本達不到這個限制XD。
Starting in MongoDB 6.0, the allowDiskUseByDefault parameter controls whether pipeline stages that require more than 100 megabytes of memory to execute write temporary files to disk by default.
在使用aggregation會有記憶體使用的上的限制,預設會是100MB,在一開始寫aggregate建議把$match
放在第一步,先過濾掉多餘不會使用到的資料,但如果真的資料量還是太大超過上限,可以透過allowDiskUseByDefault這個參數關閉預設100MB的上限,此時會改用硬碟寫入pipeline所產生的臨時文件。
但我目前使用上也沒有突破過100MB上限,改用硬碟操作aggregation效能到底會變得多差,其實不太清楚。
If the pipeline starts with an exact $match on a shard key, and the pipeline does not contain $out or $lookup stages, the entire pipeline runs on the matching shard only.
如果要搜尋的collection本身有做分片(Sharding)的話,必須注意在pipeline裡面沒辦法使用$out
和$lookup
這兩個語法,如果真的有使用到,也只會作用在primary shard而已。
參考的官方文件
本篇文章同步放在我的部落格,大家有空可以進來逛逛