一. 準備工作
在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:2701727017僅僅是讓後端來找到數據庫的,你前端知道這個地址是沒什麼用處的(你暫時可以這樣理解)因為你的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裏如果沒有這個屬性,你是無法加入這個屬性的)