數(shù)據(jù)庫概念
數(shù)據(jù)庫介紹
- 存儲(chǔ)數(shù)據(jù)的倉(cāng)庫,獨(dú)立于語言之外的軟件震嫉,可以通過api去操作它
- 生活中
- 通過倉(cāng)庫來存放物品,每個(gè)倉(cāng)庫有N個(gè)架子, 每個(gè)架子有N個(gè)物品
- 在程序中
- 通過數(shù)據(jù)庫來存放數(shù)據(jù)抖格, 每個(gè)數(shù)據(jù)庫有N個(gè)表/集合冕房,每個(gè)表/集合有N個(gè)數(shù)據(jù)/文檔
數(shù)據(jù)庫種類
-
關(guān)系型數(shù)據(jù)庫
- 遵循統(tǒng)一的SQL標(biāo)準(zhǔn)生逸,語法大同小異
- 有庫和表的約束等
- Oracle牢屋、 MySql且预、 SQLite、 SQL Server等
-
非關(guān)系型數(shù)據(jù)庫(Not Only SQL)
沒有統(tǒng)一的標(biāo)準(zhǔn)
一般以鍵值對(duì)形式存儲(chǔ)
讀取速度更快
- Mongodb(文檔)烙无、Redis/Memcache(內(nèi)存)
為什么使用數(shù)據(jù)庫
- 動(dòng)態(tài)網(wǎng)站的數(shù)據(jù)都存儲(chǔ)于數(shù)據(jù)庫中
- 可以持久存儲(chǔ)客戶端通過表單收集的用戶信息
- 可以對(duì)數(shù)據(jù)進(jìn)行高效的管理
MongoDB中的相關(guān)術(shù)語
database: 數(shù)據(jù)庫锋谐,mongodb中可以建立多個(gè)數(shù)據(jù)庫
collection:集合,一組數(shù)據(jù)的集合截酷,可以理解為js中的數(shù)組
document:文檔涮拗,一條具體的數(shù)據(jù), 可以理解為js中的對(duì)象
-
field:字段迂苛,可以理解為js中的對(duì)象屬性
field --> document --> collection --> database
目標(biāo)
- 存放項(xiàng)目數(shù)據(jù)
- 實(shí)戰(zhàn)工作中可以獨(dú)立寫api接口
MongoDB安裝步驟
-
linux環(huán)境
下載mongodb(linux)安裝包(通過winScp工具將安裝包從window移動(dòng)到linux)
遠(yuǎn)程工具連接linux(putty等)
-
移動(dòng)到安裝包的目錄解壓安裝包
tar -zxvf mongodb-linux-x86_64-xxxxx.tgz
-
將解壓包移動(dòng)到指定目錄
mv mongodb-linux-x86_64-xxxx/ /user/local/mongodb
-
創(chuàng)建數(shù)據(jù)存放目錄與日志存放目錄
mkdir -p /user/local/mongodb/data /user/local/mongodb/logs
-
啟動(dòng)MongoDB服務(wù)
/user/local/mongodb/bin/mongod --dbpath=/user/local/mongodb/data --logpath=/user/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork
-
后期登錄即可
/user/local/mongodb/bin/mongo
-
window環(huán)境
下載mongodb(window)安裝包并解壓
-
創(chuàng)建服務(wù)(dos命令窗口中移動(dòng)至安裝包的安裝路徑)
bin/mongod.exe --install --dbpath 磁盤路徑 --logpath 日志路徑
-
啟動(dòng)服務(wù)(在mongodb的bin目錄 ===》 以管理員身份運(yùn)行)
net start mongodb net stop mongodb
-
登錄(在mongodb的bin目錄 ====》 也可以直接配置環(huán)境變量)
mongo
MongoDB基本操作
查看數(shù)據(jù)庫
show databases
選擇數(shù)據(jù)庫
use 數(shù)據(jù)庫名
注意:在mongodb中選擇不存在的數(shù)據(jù)庫時(shí)不會(huì)報(bào)錯(cuò)(隱式創(chuàng)建)三热,當(dāng)這個(gè)數(shù)據(jù)庫中有內(nèi)容后會(huì)展示
查看當(dāng)前選擇的數(shù)據(jù)庫
db
刪除數(shù)據(jù)庫
db.dropDatabase()
刪除當(dāng)前選擇的數(shù)據(jù)庫
查看集合
show collections
創(chuàng)建集合
db.createCollection('集合名')
注意: 后期插入數(shù)據(jù)都是隱式創(chuàng)建集合
刪除集合
db.xxx.drop()
mongodb文檔增刪改查
數(shù)據(jù)庫主要用來存放項(xiàng)目數(shù)據(jù), 數(shù)據(jù)庫和集合的創(chuàng)建完成之后需要對(duì)文檔(數(shù)據(jù))進(jìn)行增刪改查
插入文檔
-
語法
db.集合名.insert(json數(shù)據(jù))
集合若存在三幻,則直接插入數(shù)據(jù)就漾,若集合不存在,則隱式創(chuàng)建
-
練習(xí):在test2數(shù)據(jù)庫的c1集合中插入數(shù)據(jù)(名字叫yuweiqi 年齡18歲)
use test2 db.c1.insert({ name: "yuweiqi", age: 18 }) // mongodb會(huì)給每一條文檔加一個(gè)全球唯一的_id鍵
-
可以給每條數(shù)據(jù)自定義_id 但是強(qiáng)烈不推薦
- 只要在插入數(shù)據(jù)的時(shí)候加上自定義的_id既可覆蓋
-
插入多條數(shù)據(jù)
db.c1.insert([ {name: "zhangsan", age: 18}, {name: "zhaosi", age: 19}, {name: "wangwu", age: 20} ]) // 一次性插入三條數(shù)據(jù)
-
如何快速插入多條數(shù)據(jù)
因?yàn)閙ongodb底層使用的是js引擎實(shí)現(xiàn)的念搬,所以支持部分js語法
因此可以寫for循環(huán)
for(var i = 0; i < 10; i++) { db.c1.insert({name: "a"+ i, age: i}) }
-
刪除文檔
-
語法
db.集合名.remove(條件, [,是否刪除一條]) 是否刪除一條: true 刪除全部匹配的 false 刪除一條(默認(rèn))
修改文檔
-
基礎(chǔ)語法
db.集合名.update(條件抑堡,新數(shù)據(jù)[,是否新增, 是否修改多條]) 是否新增: 根據(jù)條件匹配不到數(shù)據(jù)時(shí)是否插入該條數(shù)據(jù) true為插入 false為不插入(默認(rèn)) 是否修改多條: 將匹配成功的數(shù)據(jù)都修改 true 是 false 否(默認(rèn))
-
升級(jí)語法
db.集合名.update(條件朗徊,{修改器:{鍵:值}})
修改器 作用 $inc 遞增 $rename 重命名列 $set 修改列值 $unset 刪除列
-
準(zhǔn)備工作
for(var i = 1; i <= 10; i++) { db.c2.insert({uname: "zs"+i, age: i}) } 在test2數(shù)據(jù)庫的c2集合中插入10條數(shù)據(jù)
-
練習(xí)1:將{uname: zs1}改為{uname: zs2}
db.c2.update({uname: "zs2"}, {$set: {uname: "zs22"}})
-
練習(xí)2:將{uname: zs10}的年齡增加兩歲或者減小兩歲
db.c2.update({uname: "zs10"}, {$inc: {age: 2}}) 增加兩歲 db.c2.update({uname: "zs10"}, {$inc: {age: -2}}) 減小兩歲
-
練習(xí)3:插入數(shù)據(jù): db.c2.insert({uname: "升龍教主"首妖,age: 888, who: "男"荣倾, other:“非國(guó)人”})
db.c2.update({uname: "升龍教主"}, {$set: {uname: "升龍大教主"}}) 修改uname的值 db.c2.update({uname: "升龍大教主"}, {$rename: {who: "sex"}}) 修改who字段的字段名 db.c2.update({uname: "升龍大教主"}, {$inc: {age: 111}}) age字段的值增加111 db.c2.update({uname: "升龍大教主"}, {$unset: {other: true}}) 刪除other字段 // 一次性寫多個(gè)修改器 db.c2.update({uname: "升龍大教主"}, { $set: {uname: "升龍大教主"}, $rename: {who: "sex"}, $inc: {age: 111}, $unset: {other: true} }
查詢文檔
-
語法
db.集合名.find(條件[,查詢的字段]) // 1.條件: 查詢所有的數(shù)據(jù) ---> {}或者不寫 查詢 age=6 的數(shù)據(jù) ---> {age: 6} 查詢age=6 同時(shí) sex = "男"的數(shù)據(jù) ---> {age: 6, sex: "男"} 2.查詢的字段(可選參數(shù)) 不寫 ---> 查詢符合條件數(shù)據(jù)的所有字段 {age: 1} ---> 只顯示符合條件數(shù)據(jù)的age字段 {age: 0} ---> 不顯示符合條件數(shù)據(jù)的age字段(其他字段都顯示) 但是不管怎么寫 系統(tǒng)自定義的_id都會(huì)顯示
條件 含義 $gt 大于 $lt 小于 $gte 大于等于 $lte 小于等于 $ne 不等于 $in 包含(查詢多個(gè)) $nin 不包含
-
練習(xí)1:查詢所有的數(shù)據(jù)
db.c1.find({})
-
練習(xí)2:查詢年齡大于5歲的數(shù)據(jù)
db.c1.find({age: {$gt: 5}})
-
練習(xí)3:查詢年齡是5歲、8歲骑丸、10歲的數(shù)據(jù)
db.c1.find({age: {$in: [5, 8, 10]}})
-
練習(xí)4:只看年齡列(_id不考慮)
db.c1.find({},{age:1})
MongoDB實(shí)戰(zhàn)
排序
-
語法
db.集合名.find().sort(JSON數(shù)據(jù)) 說明:JSON中鍵時(shí)候需要排序的字段舌仍, 值為1 升序 值為-1 降序 練習(xí): 根據(jù)年齡升序&降序 db.c1.find({}).sort({age: 1}) 升序 db.c1.find({}).sort({age: -1}) 降序
分頁
-
Limit與Skip方法
db.集合名.find().sort().limit(數(shù)字).skip(數(shù)字) 說明: limit() 限制查詢數(shù)據(jù)的條數(shù) skip() 跳過指定的數(shù)量 練習(xí):降序查詢查詢2條 db.c1.find().sort({age: -1}).limit(2) 降序跳過2條并查詢2條 dn.c1.find().sort({age: -1}).skip(2)
-
實(shí)戰(zhàn)分頁
需求:數(shù)據(jù)庫1-10數(shù)據(jù),每頁顯示2條數(shù)據(jù)(5頁)
語法:
db.find().skip(m).limit(n) m: (當(dāng)前頁 - 1) * n n: 每頁顯示條數(shù)
統(tǒng)計(jì)總數(shù)量
-
語法: count()
db.集合名.find().count()
MongoDB聚合查詢
概念
- 把數(shù)據(jù)聚起來然后查詢 可以對(duì)集合中的文檔進(jìn)行變換和組合
語法
db.集合名字.aggregate([
{
管道:{表達(dá)式}
},
....
])
- 常用管道
$group 將集合中的文檔進(jìn)行分組通危,用于統(tǒng)計(jì)數(shù)據(jù)
$match 用于過濾數(shù)據(jù),只輸出符合條件的數(shù)據(jù)
$sort 聚合數(shù)據(jù)進(jìn)一步排序 1 升序 -1降序
$skip 跳過指定文檔
$limit 限制集合數(shù)據(jù)返回的文檔數(shù)
$project 增加铸豁、刪除、重命名字段
$lookup 用以引入其他集合的數(shù)據(jù)(表關(guān)聯(lián)查詢)
...
-
常用表達(dá)式
$sum: 總和 $sum: 1 相當(dāng)于count 統(tǒng)計(jì)數(shù)量 $avg: 平均 $min: 最小值 $max: 最大值
-
練習(xí)
-
統(tǒng)計(jì)男生菊碟、女生的總年齡
db.c1.aggregate([ { $group: { _id: "$sex", res: { $sum: "$age" } } } ])
-
-
統(tǒng)計(jì)男生女生的總?cè)藬?shù)
db.c1.aggregate([ { $group: { _id: "$sex", count: {$sum: 1} } } ])
-
求學(xué)生總數(shù)和平均年齡
db.c1.aggregate([ { $group: { _id: null, count: {$sum: 1}, avg: {$avg: "$age"} } } ])
-
查詢男生节芥、女生人數(shù), 按人數(shù)升序
db.c1.aggregate([ { $group: { _id: "$sex", count: {$sum: 1} } }, { $sort: { count: 1 } } ])
-
$lookup 集合(表)關(guān)聯(lián)
db.order.aggregate([ //order集合與order_item集合關(guān)聯(lián) { $lookup: { from: "order_item", // 關(guān)聯(lián)副表 localField: "order_id", // 主表的關(guān)聯(lián)字段 foreignField: "order_id", // 副表的關(guān)聯(lián)字段 as: "items" // 關(guān)聯(lián)后的數(shù)據(jù)顯示的字段 } } ])
MongoDB索引
索引概念
- 說明: 索引是一種排序好的便于快速查詢的數(shù)據(jù)結(jié)構(gòu)
- 作用:幫助數(shù)據(jù)庫高效的查詢數(shù)據(jù)
索引優(yōu)缺點(diǎn)
-
優(yōu)點(diǎn):
提高數(shù)據(jù)查詢的效率, 降低數(shù)據(jù)庫IO成本
-
缺點(diǎn):
占用磁盤空間逆害,
大量的索引影響SQL語句效率头镊,因?yàn)槊看尾迦牒托薷臄?shù)據(jù)都會(huì)更新索引
語法
-
創(chuàng)建索引語法
db.集合名.createIndex(待創(chuàng)建索引的列[,額外選項(xiàng)])
-
參數(shù):
待創(chuàng)建的索引:{ 鍵:1, ....., 鍵:-1 }
說明: 1 升序 -1降序 例如{ age: 1 } 表示創(chuàng)建age索引并升序 的方式存儲(chǔ)
額外選項(xiàng): 設(shè)置索引的名稱或者唯一索引等等
-
刪除索引語法
全部刪除:db.集合名.dropIndexes()
刪除指定:db.集合名.dropIndex(索引名)
-
查看索引語法
db.集合名.getIndexes()
-
創(chuàng)建組合索引
db.c1.createIndex({鍵: 方式,鍵: 方式})
-
創(chuàng)建唯一索引
db.集合名.createIndex(待添加索引的列, {unique: l列名})
練習(xí)
-
給name列添加普通索引
db.c1.createIndex({name: 1})
-
刪除name索引
db.c1.dropIndex("name")
-
給name列添加索引并且命名為yuweiqi
db.c1.createIndex({name: 1}, {name: "yuweiqi"})
-
創(chuàng)建組合索引 同時(shí)給兩個(gè)字段加索引
db.c1.createIndex({name: 1, age: 1})
-
給name列添加唯一索引
db.c1.createIndex({name: 1}, {unique: name})
分析索引(explain)
-
語法:
db.c1.find().explain('executionStats')
選擇原則(如何選擇合適的列做索引)
- 為常做條件魄幕、排序相艇、分組、聯(lián)合操作的字段建立索引
- 選擇唯一性索引 (同值較少如性別字段)
- 選擇較小的數(shù)據(jù)列纯陨, 為較長(zhǎng)的字符串使用前綴索引
MongoDB權(quán)限機(jī)制
需求
我們?cè)贒OS窗口直接輸入命令就可以登錄數(shù)據(jù)庫
這個(gè)在實(shí)戰(zhàn)中是不允許的
所以使用權(quán)限機(jī)制坛芽,開啟驗(yàn)證模式即可
語法
-
創(chuàng)建賬號(hào)
db.createUser({ "user": 賬號(hào), "pwd": 密碼, roles: [{ role: 角色, db: 所屬數(shù)據(jù)庫 }] })
-
角色
#角色種類 超級(jí)用戶角色: root 數(shù)據(jù)庫用戶角色: read readWrite 數(shù)據(jù)庫管理角色: dbAdmin userAdmin ......
開啟驗(yàn)證模式
概念: 用戶需要輸入賬號(hào)密碼才能登錄使用
-
操作步驟
1.添加超級(jí)管理員 2.退出卸載服務(wù) 3.重新安裝需要輸入賬號(hào)密碼的服務(wù)(注意在原安裝命令基礎(chǔ)上加上--auth即可) 4.啟動(dòng)服務(wù)
-
第一步:添加超級(jí)管理員
# mongo登錄進(jìn)數(shù)據(jù)庫 mongo # 選擇admin數(shù)據(jù)庫 use admin # 添加角色 db.createUser({ "user":"賬號(hào)"留储, “pwd”: "密碼", roles: [{ role: "角色"咙轩, db: "所屬數(shù)據(jù)庫" }] })
注意: 前面版本的數(shù)據(jù)庫是看不到admin數(shù)據(jù)庫的 直接選中就可以了
-
第二步:退出卸載服務(wù)
bin/mongod --remove
DOS窗口必須用管理員身份運(yùn)行
-
第三步: 安裝驗(yàn)證模式的mongodb
#在mongo的bin目錄下(或者配置環(huán)境變量) mongod --install --dbpath D:\MongoDB\Server\4.4\data --logpath D:\MongoDB\Server\4.4\log\mongod2.log(注意日志名字不能和之前安裝的重復(fù)) --auth
測(cè)試安裝成功: 1获讳、mongo登錄沒有warning警告
2、show adtabases 默認(rèn)看不到數(shù)據(jù)庫了
通過超級(jí)管理員賬號(hào)登錄
-
語法:
# 第一種 mongo 服務(wù)器ip地址:端口(27017)/數(shù)據(jù)庫名 -u 用戶名 -p 密碼 #第二種 先登錄 -》 再選擇數(shù)據(jù)庫 -》 輸入 db.auth(用戶名,密碼)
MongoDB備份還原
備份數(shù)據(jù)庫
-
語法
導(dǎo)出數(shù)據(jù)語法: mongodump -h -port -u -p -d -o 說明: -h host 服務(wù)器IP地址(一般不寫活喊,默認(rèn)本機(jī)) -port 端口(默認(rèn)27017 一般不寫) -u user 賬號(hào) -p pwd 密碼 -d database 數(shù)據(jù)庫(數(shù)據(jù)庫不寫則導(dǎo)出全局) -o open 備份到指定目錄
還原數(shù)據(jù)庫
-
語法:
還原數(shù)據(jù)庫語法: mongorestore -h -port -u -p -d --drop 備份數(shù)據(jù)目錄 --drop 先刪除數(shù)據(jù) 再導(dǎo)入 不寫則覆蓋
nodejs操作數(shù)據(jù)庫
mongoose模塊
- 安裝mongoose模塊
npm install mongoose // 安裝mongoose模塊
net start mongodb //開啟數(shù)據(jù)庫
net stop mongodb //關(guān)閉數(shù)據(jù)庫
-
node連接mongoodb
mongoose.connect("mongodb://localhost/playground").then(res => { console.log("數(shù)據(jù)庫連接成功") }) .catch(err => { console.log(err) })
創(chuàng)建集合
-
創(chuàng)建集合的步驟
-
對(duì)集合設(shè)定規(guī)則
const courseSchema = new mongoose.Schema({ name: String, author: String, isPublish: boolean })
-
創(chuàng)建集合
const Course = mongoose.model('Course', courseSchema);
-
創(chuàng)建文檔
-
創(chuàng)建文檔的兩種方法
-
第一種方法
const course = new Course({ name: "nodejs", author: "張三", isPUblish: false }) course.save()
-
第二種方法
Course.create({ name: "nodejs", author: "張三"丐膝, isPublish: true }, (err, doc) => { if(err === null) { console.log(doc) } }) //Course.create()返回的是Promise對(duì)象 // promise寫法 Course.create({ name: "nodejs", author: "張三", isPublish: false }).then(res => { console.log(res) }) .catch(err => { console.log(err) })
-
數(shù)據(jù)導(dǎo)入導(dǎo)出數(shù)據(jù)庫
-
準(zhǔn)備工作
- 在mongodb安裝路徑中找到mongoimport.exe/ mongoexport.exe可執(zhí)行文件
- 將路徑添加到系統(tǒng)path環(huán)境變量中
-
使用
# 導(dǎo)入json數(shù)據(jù) mongoimport -h IP(默認(rèn)本機(jī))--port 端口(默認(rèn)27017) -u 用戶名 -p 密碼 -d xxxxx -c xxxx --file xxxxx // -d 數(shù)據(jù)庫名 // -c 導(dǎo)入集合名 // --file 導(dǎo)入文件的位置 # 導(dǎo)出數(shù)據(jù) mongoexport -h IP(默認(rèn)本機(jī)) --port 端口(默認(rèn)27017) -u 用戶名 -p 密碼 -d xxxx -c xxxx -o 導(dǎo)出的文件名
查詢文檔
根據(jù)條件查詢文檔
- 指定字段值查詢
Course.find().then(res => {
console.log(res)
})
// Course 文檔名稱
//返回Course集合中所有的文檔(返回格式為數(shù)組的形式)
Course.find({_id: '123456'}).then(res => {
console.log(res)
})
//返回Course集合中符合條件的文檔 例:返回_id為'123456'的文檔
Course.findOne().then(res => {
console.log(res)
})
//返回一個(gè)文檔 若條件為空則返回Course集合中第一個(gè)文檔
-
指定字段名查詢
Course.find("name email -_id").then(res => { console.log(res) }) // 查詢字段名為name、email和字段名不為_id的文檔 查詢多個(gè)字段名則中間用空格隔開,不想要的字段前面加- 如: -_id 字段名不為_id
-
lt 小于
User.find({age: {$gt: 20, $lt: 50}}).then(res => { console.log(res) }) // 查詢User文檔中age字段大于20 小于50的文檔
-
$in
User.find({hobbies: {$in: "敲代碼"}}).then(res => { console.log(res) }) // 查詢User文檔中hobbies字段
查詢文檔排序
Course.find().sort('age').then(res => {
console.log(res)
})
//查詢文檔同時(shí)根據(jù)age字段升序排列
// -age 降序排列
限制個(gè)數(shù)查詢
Course.find().skip(2).limit(5).then(res => {
console.log(res)
})
// 跳過兩個(gè)數(shù)據(jù)并且限制只能查詢5條數(shù)據(jù)
刪除文檔
-
刪除單個(gè)文檔
User.findOneAndDelete({id: "123456"}).then(res => { console.log(res) }) // 刪除字段id值為'123456'的文檔,如果有多個(gè)也只會(huì)刪除匹配的第一個(gè)
-
刪除多個(gè)文檔
User.deleteMany({}).then(res => { console.log(res) }) // 刪除User集合中的所有文檔 返回{ n: 5, ok: 1 } 表示刪除5個(gè)文檔 刪除成功
更新文檔
-
更新單個(gè)文檔
User.updateOne({name: "張三"}, {name: "李狗蛋"}).then(res => { console.log(res) }) // 更新User集合中name字段’張三‘改為'李狗蛋'(只更新一個(gè))
-
更新多個(gè)文檔
User.updateMany({name: "張三"}胧弛, {name: "李狗蛋"}).then(res => { console.log(res) }) // 更新User集合中name字段“張三”改為”李狗蛋“(更新所有的)
mongoose驗(yàn)證
在創(chuàng)建集合規(guī)則時(shí)尤误, 設(shè)置當(dāng)前字段的驗(yàn)證規(guī)則,驗(yàn)證失敗則插入失敗
require: true //必傳字段
require: [true, '插入失敗時(shí)顯示']
示例
const postSchema = new mongoose.Schema({
name: { // name為必傳字段
type: String,
require: true
}
})
-
針對(duì)字符串的驗(yàn)證
maxlength: xxx 傳入字段的最大長(zhǎng)度 maxlength: [xx, xxxxxxx] xxxxxxx為驗(yàn)證失敗時(shí)提示
minlength:xxx 傳入字段的最小長(zhǎng)度 minlength:[xx, xxxxxxxx] xxxxxxx為驗(yàn)證失敗時(shí)提示
trim: true/false 是否允許字符串前后有空格
-
針對(duì)Number型
- max:xxxx 最大值
- min: xxxx 最小值
-
默認(rèn)值
-
default: xxxxx
publishDate: { type: Date, default: Date.now // publishDate字段類型為Date類型结缚,不傳值則默認(rèn)為當(dāng)前時(shí)間 }
-
-
enum
-
enum: xxxxx
category: { type: String, enum: ['html', 'css', 'java'] } // category 只能為html 或 css 或 java
-
- 自定義驗(yàn)證
validate: {
validate: v => {
return v && v.length > 4 //條件:長(zhǎng)度大于4
},
message: "xxxxxxxxx" //失敗時(shí)的錯(cuò)誤信息
}
集合關(guān)聯(lián)
使用id進(jìn)行關(guān)聯(lián)
使用populate方法進(jìn)行關(guān)聯(lián)集合查詢
// User集合
const User = mongose.model("User", new mongoose.Schema({
name: {
type: String
}
}))
// Post集合(關(guān)聯(lián)User集合)
const Post = mongoose.model("Post", new mongoose.Schema({
title: {
type: String
},
author: {
type: mongoose.Schema.Types.ObjectId, //固定寫法
ref: "User"
}
}))
//User集合中創(chuàng)建一個(gè)文檔
User.create({
name: "張三"
}).then(res => {
console.log(res)
})
// Post集合中創(chuàng)建一個(gè)文檔
Post.create({
title: '123',
author: 'xxxxxxxxxxx' // xxxxxxx為User集合中具體的關(guān)聯(lián)文檔的_id字段
})
// 查詢post集合
Post.find().populate('author').then(res => {
console.log(res)
})
接口開發(fā)規(guī)范(Restful API)
明確需求
說明: RESTful 是目前最流行的一種互聯(lián)網(wǎng)軟件架構(gòu)(思想)
作用: 聲明/提供可接口設(shè)計(jì)原則和約束條件(一個(gè)規(guī)范)
-
相關(guān):
get 查看 post 添加 put 修改 delete 刪除
好處: 統(tǒng)一開發(fā)規(guī)范损晤, 便于團(tuán)隊(duì)協(xié)作開發(fā)
標(biāo)準(zhǔn)的RESTful架構(gòu)需要做到
訂單模塊
/order get
/order post
/order/編號(hào) put
/order/編號(hào) delete
- 項(xiàng)目所有模塊有統(tǒng)一的標(biāo)準(zhǔn)
- 看URL就知道要操作的資源是什么(也就是哪個(gè)模塊)
- 看Http Method就知道操作動(dòng)作是什么,如post(添加) delete(刪除)
- 看Http Status Code 就知道操作結(jié)果如何红竭, 成功(200)內(nèi)部錯(cuò)誤(500)