寫在前面
hello,小夥伴們,我是 pubdreamcc
,本篇文章依舊出至於我的 GitHub倉庫 node學習教程
,如果你覺得我寫的還不錯,歡迎給個 star
,小夥伴們的 star
是我持續更新的動力 !
node學習教程GitHub
安裝 mongoDB
安裝這裡,我就不詳細介紹,大家可以根據官網選擇匹配自己電腦系統的版本安裝即可。
mongoDB download地址: download
下載下來之後,點選開啟直接下一步,下一步就 ok
了。
初體驗
- 配置環境變數
安裝完成後,會在安裝目錄下面生成一個 mongoDB
的資料夾,開啟資料夾,進入 bin
資料夾中,把這裡的路徑配置成環境變數。
- 建立儲存資料庫檔案
data
在任意碟符根目錄下建立一個 data
目錄,用來存放資料庫檔案。 mongoDB
會自動把自己安裝位置的碟符根目錄下的 data
資料夾作為自己的資料儲存目錄,這裡也可以直接在安裝位置所在碟符建立。
- 啟動 mongoDB 資料庫
如果 data
目錄建立在安裝位置的碟符根目錄下,直接
開啟命令列,敲入:
mongod
如果是其他位置,則需要指定資料存放的位置:
mongod --dbpath 檔案路徑
如果看到輸出: waiting for connections on port 27017
說明啟動資料庫成功。
- 連線資料庫
再開啟一個命令列,敲入 mongo
,則會預設連線到本地開啟的資料庫。好了,到這裡我們就完成了如何開啟一個 mongoDB
資料庫了,接下來只需往資料庫裡存資料,運算元據即可。
MongoDB
概念解析
在mongodb
中有三個基本核心的概念:
文件
集合
資料庫
它們之間是逐層包含的關係,一個集合可以包含多個文件,一個資料庫可以有多個集合,下面聽我逐一道來:
文件
: 文件是一個鍵值(key-value
)對(即BSON
),本質類似於json
物件 的鍵值對。
{"name":"pubdreamcc", "age": 24}
集合
:集合就是 MongoDB 文件組,實質上就是包含多個物件的陣列。
比如,我們可以將以下不同資料結構的文件插入到集合中:
{"name":"pubdreamcc"}
{"name":"pubdreamcc1","name":"pubdreamcc2"}
{"name":"pubdreamcc3","name":"pubdreamcc4","num":5}
資料庫(dataBase)
這裡的資料庫概念同 關係型資料庫中的資料庫概念一致,資料庫可以包含多個集合。
下面給出一張圖用來表示 mongoDB
中的一些概念同 SQL
概念 的 對比,輔助理解。
mongoDB
基本操作
在剛才我們連線上本地資料庫之後,在這個命令列,我們可以進行很多 mongoDB
提供的增刪改查等的基本操作,且聽我一一道來。
- 建立資料庫 :
use 資料庫名稱
。
如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。
MongoDB 中預設的資料庫為 test,如果你沒有建立新的資料庫,集合將存放在 test 資料庫中。
檢視所有資料庫:
show dbs
刪除資料庫:
db.dropDatabase()
,你可以使用 db 命令檢視當前資料庫名。建立集合:
db.createCollection(集合名稱)
檢視已有集合:
show collections
刪除集合:
db.集合名稱.drop()
如果成功刪除選定集合,則 drop()
方法返回 true
,否則返回 false
。
插入文件:
db.集合名稱.insert(document)
。往指定集合插入文件,文件的資料結構和JSON
基本一樣。更新文件:
update()
方法用於更新已存在的文件,語法格式:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
引數說明:
query
: update的查詢條件,類似sql update查詢內where後面的。update
: update的物件和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的。upsert
: 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。multi
: 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。writeConcern
:可選,丟擲異常的級別。
- 刪除文件:
db.collection.remove(
<query>,
<justOne>
)
引數說明
query
:(可選)刪除的文件的條件。justOne
: (可選)如果設為 true 或 1,則只刪除一個文件,如果不設定該引數,或使用預設值 false,則刪除所有匹配條件的文件。writeConcern
:(可選)丟擲異常的級別。
刪除集合所有資料:
db.collection.remove({})
查詢文件:
db.collection.find(query, projection)
引數說明
query
:可選,使用查詢操作符指定查詢條件。projection
:可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。
PS
:
如果你需要以易讀的方式來讀取資料,可以使用 pretty()
方法,語法格式如下:
db.col.find().pretty()
pretty()
方法以格式化的方式來顯示所有文件。
- 查詢一個文件(匹配條件的第一個):
db.collection.findOne()
Node操作mongoDB
方法一:
- 使用
mongoDB
官方提供的node mongodb driver
包mongoDB
,這種方法是官方提供的,感興趣的同學可以去 npm 官網查詢文件,這裡推薦下面一種方法。
方法二:
- 使用
mongoose
Mongoose
是在 node.js
環境下對 mongodb
進行便捷操作的物件模型工具。
官方 api 文件
下面說明下 mongoose
的具體用法。
- 安裝
mongoose
npm install mongoose
安裝完成後,開啟mongodb。命令列敲入:mongod
,即可開啟 mongodb
- 利用mongoose連線mongodb
新建一個js檔案,引入mongoose,這裡可以參照官網 寫的一個 hello world
。
const mongoose = require('mongoose')
// 連線資料庫
mongoose.connect('mongodb://資料庫地址(包括埠號)/資料庫名稱', (err, ret) => {
if (err) {
console.log('連線失敗')
} else {
console.log('連線成功')
}
})
這樣,我們就可以連線上資料庫了,注意:如果沒有指定資料庫名稱,則預設連線 test
資料庫。
- 建立
Schema
,設計文件結構
Schema
到底是個什麼東西呢,我們在往資料庫插入資料之前是不是應該得稍微設計下文件的結構,也就是關聯式資料庫中表的結構啥的,因為有一定的設計才使得資料的完整性,不會產生髒資料,Schema就是用來幹這個事情的,我們看下官方的介紹
Schema
主要用於定義 MongoDB
中集合 Collection
裡文件 document
的結構。mongoose
對錶結構的定義,每個 Schema
會對映到mongodb中的一個 collection
,Schema
不具備運算元據庫的能力。
定義Schema
非常簡單,指定欄位名和型別即可,支援的型別包括以下8種:
String 字串
Number 數字
Date 日期
Buffer 二進位制
Boolean 布林值
Mixed 混合型別
ObjectId 物件ID
Array 陣列
通過mongoose.Schema
來呼叫Schema,然後使用new方法來建立schema
// 引入Schema
const Schema = mongoose.Schema
// 通過 new 建立一個Schema
const userSchema = new Schema({
// 這裡來設計文件的結構,後面插入集合的每一個文件必須是以下指定的結構
name: {
type: String,
required: true // 規定 name 是必須有的欄位
},
password: {
type: String,
required: true
},
email: {
type: String
}
})
通過以上的例項,我們就建立了一個 userSchema
的架構,規定了每個文件中必須有 name
, password
欄位,且型別為 String
,email
欄位型別為 String
,有或沒有都可以。
- 把
Schema
釋出為model
(模型)
簡單說就是model
是由 Schema
生成的模型,可以對資料庫的操作。model的每一個例項(instance)就是一個文件。
把 Schema 釋出為模型只需呼叫mongoose的 mongoose.model()
方法即可,mongoose.model()
接收兩個引數,第一個參數列示模型的名稱,第二個引數是 Schema,返回值為模型建構函式。這裡一定得把第一個引數設定成和 mongoose.model()
的返回值相同,否則會出錯。最後得到的集合名稱就為模型名稱的小寫形式,如果模型名稱最後一個字元是字母,則變成複數形式,如果最後一個是數字,則不變,比如:模型名稱:User
,得到的集合名稱為: users
,模型名稱為:User1
, 得到的集合名稱為;user1
。
// 把Schema 釋出為模型
const User = mongoose.model('User', userSchema)
- 通過模型建構函式,可以對資料庫進行一系列增刪改查的操作。
好了,我們經過以上的步驟,最後就可以通過 User
模型建構函式運算元據庫了。
mongoose 操作 mongoDB
增加資料
例項化一個模型建構函式就得到一個具體文件。
const user = new User({
// 傳入具體的資料資訊,必須和之前的Schema 配置的結構一致
name: 'pubdreamcc',
password: '123456',
email: '333@pubdreamcc.com' // 可有可無
})
// 通過save()方法持久化儲存資料
user.save((err, ret) => {
if (err) {
console.log('儲存失敗')
} else {
console.log('儲存成功')
console.log(ret) // ret 就是剛新增加的文件
}
})
ok, 通過上面兩步我們就已經儲存了一條資料到資料庫中了,就是怎麼簡單。
查詢資料
查詢資料這裡有好幾個 API , 可以看下 mongoose 的官網:
- find()
- findById()
- findOne()
具體的用法和之前在控制檯 操作mongoDB 資料類似,不清楚的同學可以檢視本章第一節知識點: mongoDB資料庫的使用
這裡選取一個findOne代表
User.findOne({name: 'pubdreamcc'}, (err, ret) => {
if (err) {
console.log('查詢失敗')
} else {
console.log(ret) // ret 即為查詢出來的那一條文件
}
})
findOne()
會查詢匹配的第一個文件出來,通常傳入一個查詢條件(物件),這裡是從資料庫查詢 name
為 pubdreamcc
的文件出來。
刪除資料
刪除資料同樣也有好幾個方法,這裡參照官網 api :
- remove()
- findOneAndRemove()
- findByIdAndRemove()
用法其實和更新資料,包括前面說到的查詢資料類似,remove()
會刪除所有匹配的全部文件,findOneAndRemove()
會刪除匹配的第一個文件,findByIdAndRemove()
通過唯一的id值刪除某一個文件。
這裡選取findByIdAndRemove()
來說明,其他的小夥伴可以去 mongoose
官網 api
查詢,我就不再反覆說了,用法很簡單,大家看一下都懂的。
mongoose 官網 api: api document
User.findByIdAndRemove('id值', (err, ret) => {
if (err) {
console.log('刪除失敗')
} else {
console.log('刪除成功')
console.log(ret) // ret 即為刪除資訊反饋物件,包括成功刪了幾條資料等
}
})
更新資料
更新資料也有幾個 api 可以供我們使用,我就羅列下,然後也是選取一個加以說明,其他的小夥伴們可以去官網檢視 api 即可。
- findByIdAndUpdate()
- update()
- findOneAndUpdate()
這裡選取 update()
來演示下:
User.update({name: 'pubdreamcc'}, {email: '111@pubdreamcc.com'}, (err, ret) => {
if (err) {
console.log('更新失敗')
} else {
console.log('更新成功')
}
})
update()
方法會把所有滿足條件的資料都更新,上面我們已經把 name
為: pubdreamcc
的所有文件的email
都修改為 111@pubdreamcc.com
。
總結
本文也是我查閱相關資料,看了很多mongoDB的資料總結而來,如果有那些地方有差錯,歡迎留言評論。
需要演示的原始碼可以去GitHub倉庫檢視。
ok,that's all , thank you !