Mongoose模块 :是Node访问MongoDB数据库的封装。采用对象模式将数据库中的数据转换成JavaScript中的对象。
Schema : 它是一种以文件形式存储的数据库模型骨架(表结构)
Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
Entity : 由Model创建的实体,他的操作也会影响数据库
npm install mongoose
mongocofig.js文件:
//导入mongoose模块
const mongoose = require('mongoose')
//定义连接mongoDB的字符串(连接地址)
const db_url = 'mongodb://localhost:27017/mvc'
//连接
mongoose.connect(db_url,{useNewUrlParser:true,useUnifiedTopology:true});
//连接成功
mongoose.connection.on('connected',function (){
console.log('MongoDB Connection open'+db_url)
})
//连接失败
mongoose.connection.on('error',function (err){
console.log('MongoDB Connection error:'+err)
})
//断开连接
mongoose.connection.on('disconnected',function(){
console.log('MongoDB disconnected ')
})
module.exports = mongoose
ClassesSchema.js代码如下:
const mongoose = require('../mongoconfig')
const Schema = mongoose.Schema
//定义Schema
var ClassesSchema = new Schema({
name:{type:String},
age:{type:Number},
sex:{type:String},
hobby:{type:Array}
})
//由Schema生成Model,用Model操作数据库
module.exports = mongoose.model('Classes',ClassesSchema)
配置路由文件app.js:
var mongoRouter =require('./routes/mongo')
app.use('/mongo',mongoRouter)
A、增加:使用Model的实例调用save方法(注意:只有增加使用Entity操作数据库)
Model:ClassesModel
Entity :clazz = new ClassesModel()
clazz.save()
const express = require('express')
const ClassesModel = require('../config/model/ClassesSchema')
const router =express.Router()
//http://localhost:3000/mongo/add
router.post('/add',(req, res) => {
let clazz =new ClassesModel({
name:'黄蓉',
age:22,
sex:'女',
hobby:['武术','绘画']
})
clazz.save(function (err,result){
if(err){
res.json({
code:1001,
msg:'插入数据失败'
})
}else{
res.json({
code:1002,
msg:'插入数据成功',
data:result
})
}
})
})
测试结果:

B、删除:使用Model操作数据库
| mongoose删除方法 | 说明 |
|---|---|
| deleteOne | 删除一条记录,返回删除的数量 |
| deleteMany | 删除多条记录,返回删除的数量 |
| findOneAndDelete | 先查找后删除,若没有找到匹配的记录不执行删除,返回null |
| findByIdAndDelete | ① 没有符合 id 的数据时,返回 null。 ② id 为空或 undefined 时,返回 null。③ 删除成功返回 {} 形式的原数据。 |
deleteOne:
const express = require('express')
const ClassesModel = require('../config/model/ClassesSchema')
const router =express.Router()
//http://localhost:3000/mongo/remove
router.delete('/remove',(req, res) => {
ClassesModel.deleteOne({'name':'小明'},(err,result)=>{
if(err){
res.json({
code:1001,
msg:'删除失败'
})
}else{
res.json({
code:1002,
msg:'删除成功',
data:result
})
}
})
})
module.exports = router;

findOneAndDelete:
const express = require('express')
const ClassesModel = require('../config/model/ClassesSchema')
const router =express.Router()
//http://localhost:3000/mongo/remove
router.delete('/remove',(req, res) => {
ClassesModel.findOneAndDelete({'name':'张扬'},(err,result)=>{
if(err){
res.json({
code:1001,
msg:'删除失败'
})
}else{
res.json({
code:1002,
msg:'删除成功',
data:result
})
}
})
})
我们看一下mongdb数据库里面是否有张扬:

先查找后删除,若没有找到匹配的记录不执行删除,返回null:

C、更新:使用Model操作数据库
| mongoose更新方法 | 说明 |
|---|---|
| updateOne、updateMany | 返回更新的数量 |
| findOneAndUpdate、findByIdAndUpdate | 查找后更新,若没有找到匹配的记录不执行删除,返回null |
D、查询:使用Model操作数据库
| mongoose查询方法 | 说明 |
|---|---|
| find() | 查询所有 |
| findOne({}) | 按条件查询 |
| findById() | 按id查询 |
路由文件mongo.js代码如下:
```javascript
const express = require('express')
const ClassesModel = require('../config/model/ClassesSchema')
const router =express.Router()
//http://localhost:3000/mongo/findAll
router.get('/findAll',(req, res) => {
ClassesModel.find(function (err,result){
if(err){
console.log(err)
res.send({
code:1001,
msg:'查询失败'
})
}else{
res.send({
code:1002,
msg:'查询成功',
data:result
})
}
})
})
module.exports = router;
测试结果如下:
