在node環境下使用Mongoose來操作MongoDB

FFF方發表於2022-11-23

一. 準備工作

在create-react-app 腳手架工具的src資料夾建立pages/Server/server.js做好前期準備工作。

image.png

二. 前置檔案安裝

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,任何視覺化軟體的流程都是底層程式碼來執行的,你首先要理清楚這一點。那麼你就可以很輕鬆的掌握在編寫程式碼的時候,我應該以什麼順序來完成前期的工作。

這裡一進來就需要我們選擇連結一個服務地址

image.png

那麼對應的我們的程式碼第一步也是連結

image.png

連結好以後就是建立資料庫

mongoose提供了三個最最重要的物件,Schema,Model,Document,這三個模組使用的先後順序是必須先Schema,Model,Document的。Schema相當於約束你這個集合裡必須有的值,不然整個資料庫亂套了。

image.png

想用就得先引入,這裡可以選擇es6的結構賦值,也可以變數賦值。

首先要清楚,你的資料庫裡不可能只有一個集合,所以不同的集合的Schema也不同,這時候就需要單獨設定,Schema就是一個建構函式

image.png

你定義的userInfoSchema就是例項化了它,變數名字可以隨便定義,這不是最終的集合名稱。
注意到這一步,你僅僅是規定了集合的文件裡需要有什麼內容,而不是創造了這個集合。下一步才是創造集合,我們需要使用第二個重要的物件Model

image.png

model方法接受兩個引數,第一個是你集合的最終名字,第二個引數是集合的Schema。

在這裡和直接在mongodDB shell裡略微有些不同。你在shell裡是直接根據集合名稱來操作的如db.userInfo.insert({}),但是在mongoose裡,他並不是直接使用集合來操作,而是使用你前面的那個變數名,通常我們可以把它直接設定為和集合相同的名字。

image.png

但是,這個時候因為userinfo這個集合裡還沒有文件,所以這個集合還並沒有儲存到服務上,所以我們需要建立一個文件物件,注意了,這裡不是collection.insert()方法了,而是clooection.create(),使用方法和insert基本相同

image.png

在compass裡可以看到已經成功插入.

image.png


五.model.find()的一些相關條件查詢

image.png

image.png

上面這段話的意思是,
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身上例項化。

image.png

這時候你去檢視資料庫,發現它並沒有被新增到 userInfo這個集合裡

image.png

這是因為你只是在程式碼的世界裡建立出了一個變數user_2,如果想儲存進model內,就需要呼叫user_2.save()方法

image.png

image.png

即可看到插入了一條新資料。

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裡如果沒有這個屬性,你是無法加入這個屬性的)

相關文章