寫在前面
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 !
