一、简介
NodeJs 环境下对 MongoDB 进行便捷操作的对象建模工具
二、安装
$ npm install mongoose
三、建立连接
// config/db.js// 1. 引入 mongooseconst mongoose = require('mongoose')// 2. 定义连接的地址// 协议是特定的 mongodb// hello 指具体的数据库名字const url = 'mongodb://localhost:27017/hello'// 3. 连接mongoose.connect(url).then(() => {console.log('数据库连接成功~')}).catch((error) => {console.log('数据库连接失败!!!')console.log(error.message)})// 4. 不要忘了暴露module.exports = mongoose
四、针对不同的集合(collection)来建模
1. 将所有的模型文件都统一放置在项目的某个目录下。(这里选择 models 目录)
2. 创建模型文件,文件名建议使用集合名字的单数形式。
比如:
- user.js 指 users 集合
- good.js 指 goods 集合
3. 定义 Schema
Mongoose 的一切始于 Schema。每个 schema 都会映射到一个 MongoDB collection,并定义这个 collection 文档的构成。
// models/cat.js// 1. 引入已经连接了 MongoDB 的 Mongooseconst mongoose = require('../config/db.js')// 2. 定义 Schemaconst catSchema = new mongoose.Schema({// key -> 字段名// value -> 类型name: String, // 喵咪姓名age: Number, // 喵咪年龄master: { // 主人type: String},})/*** 3. 实例方法 (可选的)* 不会喵怎么算喵星人, 现在给猫咪 document 加个 "speak" 方法** 注意:* 1. 不要使用箭头函数,不然 this 指向会出问题。* 2. 加在 schema methods 属性的函数会编译到 Model 的 prototype,* 也会暴露到每个 document 实例*/catSchema.methods.speak = function() {console.log(`(>^ω^<)喵,我是 ${this.master} 家的 ${this.name}`)}
4. 创建 模型
基于 定义好的 schema 来创建 模型。使用
mongoose.model(modelName, schema)函数
注意:集合的名字是 modelName 的复数形式,这里 modelName 使用 **cat 。那么对应的 collection 名字是 cats**
// models/cat.js// 接第三步// 4. 创建 模型。(是一个类(构造函数),推荐首字母大写)const CatModel = mongoose.model('cat', catSchema)// 5. 不要忘了暴露模型module.exports = CatModel
五、提供接口来CURD
// routes/cats.js// 1. 引入 expressconst express = require('express')// 2. 引入 需要使用的 模型文件const CatModel = require('../models/cat.js')// 3. 实例化 express.Router 的实例const router = express.Router()/*** 查询所有的猫咪* GET http://localhost:3000/cats*/router.get('/', (req, res) => {// 使用静态方法 Model.find()CatModel.find().then((data) => {// data 就是查询出的 猫咪数组// 给客户端响应res.send({code: 0,msg: '查询成功',data})}).catch((error) => {// 将错误信息输出一下,方便后续排查问题console.log(error.message)// 给客户端响应res.send({code: -1,msg: '查询失败'})})})/*** 新创建一只猫咪,使用 Model.create()* POST http://localhost:3000/cats*/router.post('/', (req, res) => {// 1. 获取客户端传递过来的猫咪信息const { name, age, master } = req.body// 2. Model.create()CatModel.create({ name, age, master }).then(() => {res.send({code: 0,msg: '创建成功'})}).catch((error) => {console.log(error.message)res.send({code: -1,msg: '创建失败'})})})/*** 删除某个猫咪* DELETE http://localhost:3000/cats/:catId*/router.delete('/:catId', (req, res) => {// 1. 获取要删除的猫咪的id// const id = req.params.catIdconst { catId } = req.params// 2. 使用 Model.deleteOne(删除条件)CatModel.deleteOne({ _id: catId }).then(() => {res.send({code: 0,msg: '删除成功'})}).catch((error) => {console.log(error.message)res.send({code: -1,msg: '删除失败'})})})/*** 修改某个猫咪的年龄* PUT http://localhost:3000/cats/:catId*/router.put('/:catId', (req, res) => {// 1. 获取要修改年龄的猫咪的Idconst { catId } = req.params// 2. 获取要修改成的年龄 请求体传递过来const { age } = req.body// 3. Model.updateOne(修改的条件, 修改的内容)CatModel.updateOne({ _id: catId }, { age: age }).then(() => {res.send({code: 0,msg: '修改成功'})}).catch((error) => {console.log(error.message)res.send({code: -1,msg: '修改失败'})})})// end. 不要忘了暴露 routermodule.exports = router
// index.js// 1. 引入 expressconst express = require('express')// 2. 引入拆分出去的路由文件const catRouter = require('./routes/cats.js')// 3. 生成 express 实例const app = express()// 4. 一些中间件调用app.use(express.json())app.use(express.urlencoded({ extended: true }))// 5. 调用路由中间件app.use('/cats', catRouter)// end 监听端口app.listen(3000, () => {console.log('服务启动成功')})
