一、Mongodb 介紹
Mongodb
是一個文檔數據庫,以文檔形式存儲數據,格式類似于 JSON
與 Mysql 的特點及選型對照
Mongodb | Mysql | |
---|---|---|
關系類型 | 非關系型 | 關系型 |
存儲類型 | 文檔存儲(類似于寫 Word ) | 表格存儲 (類似于寫 Excle) |
操作類型 | NoSQL 操作 (不需要寫 sql 語句) | SQL 操作 |
選型對照 | 適合存儲格式比較松散的信息,如“爬蟲”下來的數據 | 適合存儲格式比較規整的信息 |
說明:并不是說在真實項目中,兩種數據庫只能選其一, 二者是可以同時使用的。對于用戶信息表等規整信息可以采用 Mysql
數據庫存儲,而對于網頁中類似博客內容等大段的富文本信息(同時包含文本、視頻、圖片等),放到 Mysql
數據庫中的一個字段中存儲就不太合適了。
二、Mongodb 及 Compass 安裝
網上安裝的資料很多,這里就不在重復了,大家可以根據以下參考博客進行安裝
Mongodb 安裝
Window 平臺安裝鏈接https://link.juejin.cn?target=https%3A%2F%2Fwww.runoob.com%2Fmongodb%2Fmongodb-window-install.html
Mac OS 平臺安裝鏈接 (推薦使用 brew 進行安裝)https://link.juejin.cn?target=https%3A%2F%2Fwww.runoob.com%2Fmongodb%2Fmongodb-osx-install.html
安裝后默認的運行了 Mongodb
服務器,以及連接上了 Mongodb
, 可以直接通過命令行進行操作了。如果你還連接不上 Mongodb
,請參考上面安裝連接中的配置。
Mongodb Compass 安裝
Mongodb Compass 是官方推薦的一款可視化工具,可以方便直觀的進行數據的瀏覽和操縱
安裝鏈接https://link.juejin.cn?target=https%3A%2F%2Fwww.jianshu.com%2Fp%2Fca1e722b6788
三、重要概念
1、和 Mysql 的差異
對于關系型數據庫,使用時通常是先創建數據庫,再創建表,然后對記錄的增刪改查
但在 Mongodb
中這些名詞上有些差異,操作步驟如下:
- 創建一個數據庫 (
database
) -- 和Mysql
相同 - 創建集合 (
collection
) -- 對應Mysql
中的表 - 對文檔 (
document
) 的增刪改查 -- 對應Mysql
中記錄的增刪改查
2、BSON
Mongodb
的文檔使用的格式是BSON
BSON
= BinaryJSON
,是二進制類型的JSON
四、使用 Compass 操作 Mongodb
1、打開后的界面如圖所示,點擊 “CONNECT” 進行連接
2、新安裝的?Mongodb
?默認帶了三個數據庫; 點擊 “CREATE DATABASE” 進行創建數據庫?
?
3、創建數據庫和集合?
?
4、點擊 “ADD DATA” 可以增加文檔?
?
5、文檔的格式如下圖 :?
?
6、對文檔的查找、修改和刪除?
?
注:查找時輸入的數據也是類似于?JSON
?的格式
五、使用命令行操作 Mongodb
打開 Mongodb 目錄下 bin/mongo.exe
注:dbName、collName 等 請改為自己創建的數據庫或集合的名字
1、查看操作
# 查看有哪些數據庫
show dbs# 創建或進入數據庫 (當數據庫不存在即創建)
use dbName# 查看有哪些集合
show collections
2、創建集合 / 向集合中插入文檔
# 可以直接向集合插入數據,對不存在的集合將會創建
db.collName.insert({"name":"Axton", "age":20})
3、顯示集合中的文檔
# 顯示集合中全部文檔
db.collName.find()# 顯示集合中特定文檔
db.collName.find({ "name":"Axton" })# 排序,按 ID 倒序排序
db.collName.find().sort({_id:-1})
4、更新文檔
db.collName.update({"name":"Axton", $set:{"name": "Axton2"}})
5、刪除文檔
db.collName.update({"name":"Axton", $set:{"name": "Axton2"}})
?
六、Node.js 中使用 mongodb 插件連接數據庫
1、初始化環境
# 初始化 node.js 環境
npm init -y# 安裝 mongodb 模塊
npm i mongodb --save
?2、連接到 Mongodb
const MongoClient = require('mongodb').MongoClientconst url = 'mongodb://localhost:27017' // 默認端口號為 27017 ,如修改過請自行更改
const dbName = 'mydb' // 需要連接的數據庫名字MongoClient.connect(url,{// 配置 (默認寫上就好)useUnifiedTopology: true},(err, client) => {if (err) {console.error('mongodn connect error', err)return}console.log('mongodb connect success')// 切換到數據庫const db = client.db(dbName)// 關閉連接client.close()}
)
3、文檔(Document)的操作
查詢文檔
const MongoClient = require('mongodb').MongoClientconst url = 'mongodb://localhost:27017'
const dbName = 'mydb'MongoClient.connect(url, {useUnifiedTopology: true},(err, client) => {if (err) {console.error('mongodn connect error', err)return}console.log('mongodb connect success')const db = client.db(dbName)// 使用集合const usersCollection = db.collection('students')// ------- 文檔的操作代碼寫在此部分,之后將不再包含連接部分代碼 -------// 查詢文檔usersCollection.find({ // find() 內不寫內容則為查詢全部文檔"name" : "Axton"}).toArray((err, res) => {if (err) {console.error(err)return}console.log(res)// find() 為異步操作,為了使查詢完后在關閉數據,所以放至此位置client.close()})// -------------------------------------------------------------}
)
插入文檔
// 插入一條數據, 插入多條可以選擇 insertMany()
usersCollection.insertOne({name: 'Jack',sex: '男',age: 21
}, (err, res) => {if (err) {console.error(err)return}console.log(res)client.close()
})
更新文檔
// 更新一條數據, 更新多條可以選擇 updateMany()
usersCollection.updateOne({name: 'Jack'}, // 查詢條件{$set: {info: '女裝'}}, // 更新的內容(err, res) => {if (err) {console.error(err)return}console.log(res)client.close()}
)
刪除文檔
// 刪除一條數據, 刪除多條可以選擇 deleteMany()
usersCollection.deleteOne({name: 'Jack'
}, (err, res) => {if (err) {console.error(err)return}console.log(res)client.close()
})
4、說明
mongodb
?是偏底層一點的插件,此處學習使用此插件是為了讓大家了解連接?mongodb
?的一些原理。在日常中,為了利于項目開發,通常使用?mongoose
?插件
七、Node.js 中使用 mongoose 插件連接數據庫
1、說明
由于 mongodb
的數據格式過于靈活,容易導致多人開發時數據格式出錯,使用 mongoose
可以更加規范的使用數據.
重要名詞和操作
- Schema 定義數據格式的規范
- 以 Model 規范 Collection
- 規范數據操作的 API
2、初始化環境
安裝 mongoose 插件
npm i mongoose --save
目錄結構
mongoose-test
├── package-lock.json
├── package.json
├── node_modules
└── src├── db.js├── models│ └── Student.js└── test└── student.js
3、創建連接服務
db.js
const mongoose = require('mongoose')const url = 'mongodb://localhost:27017'
const dbName = 'myblog'mongoose.connect(`${url}/${dbName}`, {useUnifiedTopology: true,useNewUrlParser: true
})const db = mongoose.connection // 將連接對象賦給 db// 發送錯誤
db.on('error', err => {console.error(err)
})// 連接成功
db.on('open', () => {console.log('success!')
})module.exports = mongoose
4、定義 Schema 規范和創建模型
models/Students.js
// 對應 students 集合const mongoose = require('../db')// 用 Schema 定義數據規范
const StudentSchema = mongoose.Schema({name: {type: String,required: true,unique: true},sex: String,age: Number
}, {timestamps: true // 時間戳, 在插入、更新數據后將會加上相應的時間數據// 在每一條文檔中加入 createdAt 和 updatedAt
})// Model 對于 Collection
const Student = mongoose.model('student', StudentSchema)module.exports = Student
5、文檔(Document)的操作
test/students.js
查詢文檔
const Student = require('../models/Student')// 自執行的異步函數
!(async () => {// 查詢文檔const res = await Student.find({name: 'Axton'})// 用正則表達式模糊查詢文檔const res2 = await Student.find({name: /A/})// 根據 ID 查詢單條文檔const res3 = await Student.findById('5fb2247e6469170600f02551')})()
插入文檔
const Student = require('../models/Student')!(async () => {// 插入文檔const res = await Student.create({name: 'Jack',age: 21,sex: '男'})})()
更新文檔
const Student = require('../models/Student')!(async () => {// 更新文檔const res = await Student.findOneAndUpdate({name: 'Jack'}, // 查詢的條件{sex: '女'},{new: true // 返回修改之后的內容,默認為 fasle})})()
刪除文檔
const Student = require('../models/Student')!(async () => {// 刪除文檔const res = await Student.findOneAndDelete({name: 'Jack'})})()
八、總結
本文只是把?mongodb
?和?node.js
?連接?mongodb
?等基礎操作進行了整理,能用在常用的一些場景中。對于更高級的一些操作可以自行參考官方文檔。如果發現本文有錯誤的地方或者寫的不好的地方請在評論區指出。