首先需要搭建一個簡單的應用 前端部分不多贅述,如果確實沒接觸過 Vue 項目,可以參考我的《Vue 爬坑之路》系列 後端服務可以參考之前的文章《Node.js 蠶食計劃(六)—— MongoDB + Koa 入門》 完整的項目地址:https://github.com/wisewrong/Test- ...
首先需要搭建一個簡單的應用
前端部分不多贅述,如果確實沒接觸過 Vue 項目,可以參考我的《Vue 爬坑之路》系列
後端服務可以參考之前的文章《Node.js 蠶食計劃(六)—— MongoDB + Koa 入門》
完整的項目地址:https://github.com/wisewrong/Test-GraphQL-App,結合項目食用本文更香哦~
一、Mongoose
在上一篇文章《Node.js 蠶食計劃(六)》里,直接使用了 mongodb 中間件來連接資料庫,並嘗試著操作資料庫
但我們一般不會直接用 MongoDB 的原生函數來操作資料庫,Mongoose 就是一套操作 MongoDB 資料庫的介面
1. Schema 與 Model
Schema 是 Mongoose 的基礎,用來定義集合的數據模型,也就是傳統意義上的表結構
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 影片信息
const MovieSchema = new Schema({
name: String, // 影片名稱
years: Number, // 上映年代
director: String, // 導演
category: [String], // 影片類型
comments: [ // 影評
{
author: String,
createdAt: {
type: Date,
default: Date.now(),
},
updatedAt: {
type: Date,
default: Date.now()
}
}
],
});
module.exports = mongoose.model('Movie', MovieSchema);
上面的最後一行代碼,是基於定義好的 Schema 生成 Model,我們可以通過 Model 來操作資料庫
mongoose.model('ModelName', SchemaObj)
這裡的 model() 方法可以接收兩個參數,第二個參數是創建好的 Schema 實例
第一個參數 ModelName 是資料庫中集合 (collection) 名稱的單數形式,Mongoose 會查找名稱為 ModelName 複數形式的集合
對於上例,Movie 這個 model 就對應資料庫中 movies 這個 collection,如果資料庫沒有對應的集合會自動創建
2. Model 的增刪改查
在 mongoose 中是通過操作 Model 來實現資料庫的增刪改查
< 新增 >
Model.create(data, callback)
< 查詢 >
// 返回所有符合查詢條件 conditions 的數據
Model.find(conditions, callback);
// 返回找到的第一個文檔
Model.findOne(conditions, callback);
// 只針對主鍵 _id 查詢
Model.findById('_id', callback);
< 修改 >
// 批量修改符合條件 conditions 的數據
Model.updateMany(conditions, update, options, callback)
// 修改指定 id 的數據
Model.findByIdAndUpdate(id, update, options , callback)
// 修改第一個符合查詢條件的數據
Model.updateOne(conditions, update, options , callback)
// 替換第一個符合查詢條件的數據
Model.replaceOne(conditions, update, options , callback)
< 刪除 >
// 刪除符合條件的所有數據
Model.remove(conditions, callback);
// 刪除指定 id 的數據
Model.findByIdAndRemove(id, options, callback);
比如封裝一個插入數據的方法:
const Movie = require('../mongodb/models/movie');
// 新建電影
const createMovie = (req) => {
return Movie.create(req);
}
// 更新電影信息
const updateMovie = (req) => {
return Movie.findByIdAndUpdate(req._id, req, {
new: true,
});
}
// 保存電影
const saveMovie = async (ctx, next) => {
const req = ctx.request.body;
// 校驗必填
if (!req.name) {
return { message: '影片名稱不能為空' }
}
const data = req._id
? await updateMovie(req)
: await createMovie(req);
return { data };
};
module.exports = {
saveMovie,
};
mongoose 也有更規範的查詢條件,可以參考官網的 Query 配置
3. 連接資料庫
使用 mongoose.connect 連接資料庫,可以在 connect 方法中傳入第二個參數作為回調
也可以通過 mongoose.connection.on 來監聽相應的事件
/* /mongodb/index.js */
const mongoose = require("mongoose");
const { dbUrl } = require("../config");
// const dbUrl = 'mongodb://127.0.0.1:27017/Movie'; // 資料庫地址
const connect = () => {
// mongoose.set('debug', true)
mongoose.connect(dbUrl);
mongoose.connection.on("disconnected", () => {
mongoose.connect(dbUrl);
});
mongoose.connection.on("error", (err) => {
console.error('Connect Failed: ', err);
});
mongoose.connection.on("open", async () => {
console.log('