1. 安裝 momgodbphp
brew install mongodb
安裝成功後執行 which mongod
啓動:mongodhtml
2. 下載可視化操做數據庫的軟件 https://robomongo.org/download Robo 3T 先啓動數據庫監聽,而後再打開該軟件,連接mongodb
3. mongoose 中文文檔 https://mongoose.shujuwajue.com/數據庫
4.啓動數據庫報錯:npm
建立數據庫文件夾,服務器
修改讀寫權限,(Mac 修改文件讀寫權限)app
設置path路徑,添加到mongod啓動參數koa
若是命令沒法執行,加上 sudocurl
sudo chmod a+w /root/.local/share/mongo/db 異步
sudo chmod a+w /data/db
具體如何倒騰成功的 我也不太清楚,反正是上面的幾個步驟來回倒騰,路徑的話 基本上是 /root/.local/share/mongo/db 和 /data/db
多嘗試幾回。
5.
在命令行中執行:
curl -d "name=lilie&&age=12" http://localhost:3000/addPerson
curl是在sell命令 請求接口 -d表示post請求
6.
由下圖能夠看出
1. 我在代碼中新建的數據庫的名字是在 dbs/config.js 文件中設置的 dataUser;
解釋一下:若是在model/truk.js中定義了model, mongoose.model('demo',schema);則數據庫中的表名稱是 demos,與代碼文件名是無關的!
2.在models文件夾下設置的文件名稱即對應着數據庫中Collections的單數,也就是說 代碼中 寫的是model 在數據庫中是 models;相似的,代碼中 person,對應着數據庫中的people
7.鏈接數據庫的步驟:
1. 啓動數據庫 mongodb,執行命令 mongod,提示監聽 27017端口便可;而後打開 RoBo 3T軟件,自動鏈接 localhost;最後啓動本地 koa 服務器 npm run dev;
2.
項目結構如左圖所示,
2.1 新建dbs文件夾,在dbs/config.js文件中 設置鏈接的數據庫
module.exports = { dbs: 'mongodb://127.0.0.1:27017/dbs' }
2.2 在dbs/models文件夾下 建立表:
const mongoose = require('mongoose') //Schema 建立表的格式 let personSchema = new mongoose.Schema({name: String, age: Number}) //model是鏈接 操做數據表 和 建立表 的一個橋樑,具體如何實例化,須要在請求接口的 routers/index.js中實例化 module.exports = mongoose.model('Model', personSchema)
2.3 在主文件app.js中綁定數據庫和服務器代碼:
const mongoose = require('mongoose') const dbConfig = require('./dbs/config') //使用mongoose 鏈接數據庫 dbs mongoose.connect(dbConfig.dbs,{ useNewUrlParser:true })
2.4 在routes/index.js 文件中實例化規定的具體的表的值,即操做數據庫,增刪改查
2.4.1 增長數據
router.post('/addPerson', async (ctx, next) => { const person = new Person({ name:ctx.request.body.name, age:ctx.request.body.age }) let code; try { await person.save(); //在這裏保存到數據庫中,注意1.操做數據庫是異步 2.person 使用的是數據庫model的實例化 code = 0; } catch (error) { code = 1 } ctx.body = { code } })
新開命令行,執行 curl -d "name=lilie&&age=12" http://localhost:3000/addPerson 而後 打開 RoBo 3T 右擊 New Connection 選擇refresh,則能夠看到數據庫中添加的數據!
2.4.2 查詢數據
router.post('/getPerson', async(ctx,next)=>{ //注意的是,查詢使用的是 Person 不是實例化的 person const result = await Person.findOne({name:ctx.request.body.name})//獲取單個數據 const results = await Person.find({name:ctx.request.body.name})//獲取多個數據 ctx.body = { code:0, result, results } })
2.4.3 刪除數據
router.post('/removePerson', async(ctx,next)=>{ //注意的是,查詢使用的是 Person 不是實例化的 person await Person.where({ age:ctx.request.body.age }).remove() ctx.body = { code:0 } })
2.4.4 更新數據
router.post('/updatePerson', async(ctx,next)=>{ //注意的是,查詢使用的是 Person 不是實例化的 person const result = await Person.where({ name:ctx.request.body.name }).update({ //改成 updateMany 則更新多條知足的數據 age:ctx.request.body.age }) ctx.body = { code:0, result } })
注意:只有增長數據使用的是實例化 new Person 其餘的直接使用的是Person