[从入门到入土(后端篇)]六,nodejs中使用mongoose的其他操作
上篇说到在nodejs中简单使用增删改查操作,但是在实际项目应用中存在其他复杂的操作,这篇本章将会讲解我在项目中使用的其他操作,后续遇到新的会不定时增加
一.分页查询
应用场景:博客文章会越来越多,如果一次加载全部界面会特别卡,所以使用分页查询
model(部分参数):
let Blog = new mongoose.Schema({
title:{type:String,default:""}, //标题
content:{type:String,default:""},//简介
type:{type:Number,default:0},//类型
updateDate:{type:String,default:""}//更新时间
});
查询方法:
let result = await blog
.find({type:1})
.skip((page - 1) * parseInt(pageSize)) //跳过多少个数据
.limit(parseInt(pageSize)) //查询多少条数据
.sort({'updateDate': -1}); //按照时间排序
- .find(object) //查询条件
- .skip(num) //跳过多少条 page为页数(从1开始)
- .limit(num) //最后返回多少条
- .sort(objec) //排序方式
二.模糊查询
应用场景:在后台管理中,有许多的文章,我需要通过名字,或者简介中的某一些文字来进行查询。
model(部分参数):
let Blog = new mongoose.Schema({
title:{type:String,default:""}, //标题
content:{type:String,default:""},//简介
type:{type:Number,default:0},//类型
updateDate:{type:String,default:""}//更新时间
});
查询方法:
let regexp = new RegExp(ctx.request.body.searchTxt, 'i')
let result = await blog
.find({
'type': type, //其他参数 需要就添加不需要就没有
$or: [
{title: {$regex: regexp}}, //标题正则匹配
{content: {$regex: regexp}} //简介正则匹配
]
})
.skip((page - 1) * parseInt(pageSize)) //跳过多少个数据
.limit(parseInt(pageSize)) //查询多少条数据
.sort({'updateDate': -1}); //按照时间排序
- 多了正则匹配 直接看代码 就不多介绍方法
三.聚合查询-统计分类
应用场景:在后台管理中,我需要统计每一天有多少人访问,然后做一个折线图
model:
let webRead = new mongoose.Schema({
userIP:{type:String,default:""},
time:{type:Number,default:""},
});
查询方法:
let result = await webReadM.aggregate([
{
//临时参数day 这个参数将time中的时间戳 转换为日期格式
$project:{
day: {
"$dateToString" : {
"format" : "%Y-%m-%d",
"date" : {"$add":[new Date(0),"$time",28800000]}
}
}
}
},
{
//将相同day的参数计数 _id:为day的数值 number为总数
$group:{
_id:"$day",
number:{$sum:1}
}
},
{
//按照_id 进行排序
$sort:{_id:1}
}]);
返回结果:
然后前端就可以根据这些数据进行图表展示
四.聚合查询-多表查询
应用场景:在后台管理中,我需要知道哪个用户看了哪篇文章或者对哪篇文章点赞
model(部分参数):
//博客查看模型
let blogRead = new mongoose.Schema({
blogId:{type: mongoose.Schema.ObjectId, required: true},
userIP:{type:String,default:""},
time:{type:String,default:""},
});
//博客模型
let Blog = new mongoose.Schema({
title:{type:String,default:""}, //标题
content:{type:String,default:""},//简介
type:{type:Number,default:0},//类型
updateDate:{type:String,default:""}//更新时间
});
由于博客ID为mongoose自动生成的_id 所以blogRed中的blogId 类型为mongoose.Schema.ObjectId
如果使用默认ID,必须修改关联ID类型,否则会查不到数据
查询方法:
let result = await blogReadM.aggregate([{
$lookup: {
from: 'blogs', // 需要去查询哪一个表
localField: 'blogId', // blogRead的键 名字
foreignField: '_id', // blogs表的_id
as: 'list' // 得到数据的别名
}
}])
.sort({'time': -1}) //按照时间排序
.skip((page - 1) * parseInt(limit)) //跳过多少个数据
.limit(parseInt(limit)) //查询多少条数据
- 意思就是,那bolgread中的blogId去找blog表中_id = blogId的那条数据 那条数据在list中展示
效果
最后
暂时分享四个,后期整理下再更新内容