使用Mongoose对MongoDB进行操作
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test',{
})
Mongoose中的Schema
- 定义Schema
categorySchema
const categorySchema = new mongoose.Schema({
name:String,
description: String,
createdAt:{
type: Date,
default: Date.now
}
});
- 通过model方法获得该模型
const Category = mongoose.model('Category', categorySchema);
- 实例化一个新的对象来新增数据
const category = new Category({
name: 'test',
description: 'test category'
});
- 通过save方法,保持对象到数据库中
category.save(err=>{
if(err){
console.error(err);
return
}
console.log('saved');
})
- 直接通过模型的Create方法
Category.create({
name:'test',
description: 'test category'
}, (err, category)=>{
if(err){
console.error(err);
} else {
console.log(category)
}
});
- 通过find方法,查询name='test’的结果
Category.find({
name:'test'
}, (err, res) =>{
if(err){
console.error(err)
} else{
console.log(res);
}
});
- 删除数据
Category.remove({
name:'test'
}).then(()=>{
})
- 更新数据
Category.update({
name:'test'
},{
name:'test1',
description: 'test1'
}).thenm(()=>{
})
栗子
-
目录结构如下
-
说明:
course.js
:定义了Course表的结构
coon.js
:连接数据库
db.js
:接口的封装
app.js
:负责路由处理和基本的koa相关的配置 -
/mongoDB/model/course.js
const mongoose = require('mongoose');
const timeRangeSchema = new mongoose.Schema({
hour: {
type: Number,
max: 24,
min: 8
},
minute: {
type: Number,
max: 59,
min: 0
},
time: {
type: Number,
get() {
return this.get('hour') * 100 + this.get('minute');
}
}
});
const courseSchema = new mongoose.Schema({
name: String,
startTime: timeRangeSchema,
endTime: timeRangeSchema
})
const Course = mongoose.model('Course', courseSchema);
module.exports = Course;
db.js
const Course = require('./model/course');
const getCourseList = async () => {
return await Course.find({}).sort({
'startTime.time': 1
});
}
const getCourseById = async (id) => {
return await Course.findById(id);
}
const getCourseByTime = async (start, end, weekday) => {
return await Course.find({
weekday: weekday
})
.where('startTime.time').gte(start.hour * 100 + start.minute)
.where('endTime.time').lte(end.hour * 100 + end.minute);
}
const addCourse = async (course) => {
const { name, weekday, startTime, endTime } = course;
const item = await getCourseByTime(startTime, endTime, weekday);
if (item) {
throw new Error('当前时间段已经安排了课程');
}
return await Course.create(course);
}
const updateCourse = async (id, course) => {
return await Course.update({
_id: id
}, course);
}
const removeCourse = async (id) => {
return await Course.remove({
_id: id
});
}
module.exports = {
getCourseList,
getCourseById,
addCourse,
updateCourse,
removeCourse
}
conn.js
const mongoose = require('mongoose');
const connect = async () => {
await mongoose.connect('mongodb://localhost/course', {
useNewUrlParser: true,
useUnifiedTopology: true
});
}
const close = async () => {
await mongoose.connection.close();
}
module.exports = { connect, close }
app.js
const koa = require('koa');
const app = new koa();
const router = new require('koa-router')();
const bodyParser = require('koa-bodyparser');
const {
getCourseList,
getCourseById,
addCourse,
updateCourse,
removeCourse
} = require('./db');
const {
connect,
close
} = require('./conn');
const JSON_MIME = 'application/json';
router.get('/course', async ctx => {
ctx.type = JSON_MIME;
ctx.body = {
status: 0,
data: await getCourseList()
}
});
router.get('/course/:id', async ctx => {
ctx.type = JSON_MIME;
ctx.body = {
status: 0,
data: await getCourseById(ctx.params.id)
}
});
router.post('/course', async ctx => {
ctx.type = JSON_MIME;
await addCourse(ctx.body);
ctx.body = {
status: 0
}
});
router.put('/course/:id', async ctx => {
await updateCourse(ctx.params.id, ctx.body);
ctx.body = {
status: 0
}
});
router.delete('/course/:id', async ctx => {
await removeCourse(ctx.params.id);
ctx.body = {
status: 0
}
})
app.use(async (ctx, next) => {
await connect()
await next()
await close()
})
app.use(bodyParser());
app.use(router.routes());
app.listen(3000, async () => {
console.log('Server is running at http://localhost:3000');
})