一. 準備工作
在create-react-app 腳手架工具的src資料夾建立pages/Server/server.js做好前期準備工作。
二. 前置檔案安裝
yarn add mongoose
,yarn add express
,yarn add nondemon
三. 理清概念
我們要知道要使用mongoDB資料庫,你必須先啟動mongoddb的服務,預設地址是localhost:27017
,才可以運算元據庫,在這裡我們需要首先要分清楚和透過node express建立埠號的區別。
前端發起的請求如get,post等這些方法,你如果直接給localhost:27017
傳送,資料庫是無法處理這些資料的,它身上不存在響應這些方法的api。不然要後端幹什麼,你前端直接都能和伺服器交流了,後端就沒什麼存在的意義了。
那怎麼辦呢?資料獲取不了我沒辦法下班啊,這時候就需要後端來當這個中間人。後端的語言正好可以用來識別前端發過來的請求,並且還可以訪問資料庫,這不正好當這個紅娘嗎?
server.js這個檔案就是後端來編寫程式碼的地方,來設定不同的埠號和請求方法來區分資料庫裡資料的型別。比如買汽車,汽車裡面有轎車,跑車。那麼後端就可以給轎車先區別一個埠號1000,給跑車一個埠號2000,然後再細分,用來方便快速的獲取不同型別的資料。
而localhost:27017
27017僅僅是讓後端來找到資料庫的,你前端知道這個地址是沒什麼用處的(你暫時可以這樣理解)因為你的js語言寫出來的程式碼,資料庫不認識。
四. 連結mongoDB
我們都知道mongoDB有視覺化軟體compass,任何視覺化軟體的流程都是底層程式碼來執行的,你首先要理清楚這一點。那麼你就可以很輕鬆的掌握在編寫程式碼的時候,我應該以什麼順序來完成前期的工作。
這裡一進來就需要我們選擇連結一個服務地址
那麼對應的我們的程式碼第一步也是連結
連結好以後就是建立資料庫
mongoose提供了三個最最重要的物件,Schema,Model,Document
,這三個模組使用的先後順序是必須先Schema,Model,Document
的。Schema相當於約束你這個集合裡必須有的值,不然整個資料庫亂套了。
想用就得先引入,這裡可以選擇es6的結構賦值,也可以變數賦值。
首先要清楚,你的資料庫裡不可能只有一個集合,所以不同的集合的Schema也不同,這時候就需要單獨設定,Schema就是一個建構函式
你定義的userInfoSchema就是例項化了它,變數名字可以隨便定義,這不是最終的集合名稱。
注意到這一步,你僅僅是規定了集合的文件裡需要有什麼內容,而不是創造了這個集合。下一步才是創造集合,我們需要使用第二個重要的物件Model
model
方法接受兩個引數,第一個是你集合的最終名字,第二個引數是集合的Schema。
在這裡和直接在mongodDB shell裡略微有些不同。你在shell裡是直接根據集合名稱來操作的如db.userInfo.insert({})
,但是在mongoose裡,他並不是直接使用集合來操作,而是使用你前面的那個變數名,通常我們可以把它直接設定為和集合相同的名字。
但是,這個時候因為userinfo這個集合裡還沒有文件,所以這個集合還並沒有儲存到服務上,所以我們需要建立一個文件物件,注意了,這裡不是collection.insert()方法了,而是clooection.create(),使用方法和insert基本相同
在compass裡可以看到已經成功插入.
五.model.find()的一些相關條件查詢
上面這段話的意思是,
1.第一個引數:找到userName為admin1
的使用者列表
2.第二個引數:並且只顯示userName
屬性,且不顯示_id
屬性,(需要知道的是,mongodb預設會返回_id
)
3.第三個引數:跳過第一個,並且只顯示一個 條件結果。
4.第四個引數:一個函式,該函式必須填寫,第一個結果是err,如果查詢失敗,會把失敗的結果返回給第一個引數,如果成功會把我們查詢的結果返回給第二個引數。
為什麼該函式必須填寫呢?因為我們的業務邏輯就是在這個回撥函式的第二個引數裡執行的,你光找到資料了,沒處理,那麼你呼叫find有什麼意義呢?
注意find()
是返回的是陣列,需要加索引來獲取內容,docs[1].xxx.findOne
直接就是一個物件。可以直接用docs.xxx獲取相對應的屬性。
六.document的一些增刪改方法
1.1增
上面透過model可以進行對文件,也就是資料的一些新增,我們還可以直接透過對文件的操作來進行資料的新增。因為model也是一個建構函式,那麼我們就可以直接在model身上例項化。
這時候你去檢視資料庫,發現它並沒有被新增到 userInfo這個集合裡
這是因為你只是在程式碼的世界裡建立出了一個變數user_2,如果想儲存進model內,就需要呼叫user_2.save()
方法
即可看到插入了一條新資料。
1.2改
你既然都已經拿到user_2這個實際的資料了,那update
也太so easily了。
你可以透過兩種方法來實現。
1.user_2.update({$set:{userName:"admin3"}});
或者更加簡單直接,提個醒,user_2
是你例項化的一個物件,還想不起來嗎?
2我反手直接修改這個物件的屬性不就好了嗎?.user_2.userName="admin4"
但是注意,你這一步只是修改了程式碼世界裡的變數,別忘了執行user_2.save()
1.3刪
user_2.remove()
還是那句話,不建議直接刪除資料,而是給需要刪除的資料一個額外的屬性,例如user_2.isdelete=true
以後來透過find()方法篩選掉這些isdelete
為true的就可以了。(這裡要注意,你的Schema裡如果沒有這個屬性,你是無法加入這個屬性的)