在AlphaCamp的後端課程中,除了研究套件、資料庫的使用外,另一個讓我苦思已久的東西,就是建立一個搜尋功能了,整個學期下來做了不少次。
首先是餐廳清單
這時候要求很簡單,只要能過濾一種條件就好,所以很天真寫了另一個路由,把所有條件都變成一個個路由,不過這樣既不符合RESTful 設計(傾向用 query 的方式設計),也很繁雜。
接著第五週做帳本清單
需要更複雜搜尋功能,可以做兩種類別篩選,又可以選擇一種排序,這個排序又有升冪降冪差別;這時候用JS去篩選資料已經太繁雜了,所以使用資料庫的語法去找資料。
這邊使用了指定物件property的做法設定要篩選的類型type名稱,並且用條件判斷指定type的value,配合資料庫的語法成功將所有條件納入篩選條件中。
最後期末的題目,以MySQL作為資料庫,用 Sequelize 重新篩選帳本資料
這邊最苦惱的是不可能把所有路由一一做出來,Sequelize 的語法也跟 MongoDB不同,篩選的條件不能放入空值。
像是一開始原本打算找資料的月份篩選,所以找了很多辦法,例如使用SQL的Where語法(參考資料)
也想到正規式表達法來取得月份(參考資料)
首先在嘗試SQL語法的過程中,發現到一個問題,如果不需要篩選月份,那我要怎麼設定資料庫搜尋的方法?搜尋條件內,什麼資料都不放入,則是會導致搜尋失敗。後來想到Sequelize是JS的ORM,所以只要將搜尋條件獨立做成物件獨立出來就好,這時候又遇到問題,sequelize.where是資料庫裏面的物件,不能獨立出來(找不到Sequelize)。
所以接者嘗試用正規表達式,不過發現也沒辦法執行,終端顯示MySQL only,當下非常困惑。
前面的方法都失敗了,所以又回到Model Querying — Basics翻找適合的方法,搜尋關鍵字Date找到Operators
Operators又可以獨立在資料庫搜尋外,所以沒有像sequelize.where那樣的問題
配合第五周學到的JS語法,成功做出日期篩選條件的物件資料!(不過做完才發現篩選的項目不是月份,而是日期,那又是另一個故事了)
最後將所有篩選條件組成物件,傳到資料庫內的model內做搜尋,搜尋功能就大功告成了。
回顧整個過程,做了好幾次搜尋功能,除了學到了不少JS語法外,也熟悉了MongoDB、MySQL資料庫搜尋方法,這些經驗的累積,讓我在建立搜尋功能時,有跡可循,套用過往經驗才有辦法做出複雜的篩選條件。
最後,在資料庫的搜尋語法上還是很不熟悉,從尋找的過程中,發現MongoDB、MySQL資料搜尋的功能很強大,但是自己還是太新手了,好多方法都沒辦法駕馭,真的是很可惜,有時間的時候,再來挑戰幾次!