[从入门到入土(后端篇)]六,nodejs中使用mongoose的其他操作

[从入门到入土(后端篇)]六,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}
            }]);

返回结果:
601.png

然后前端就可以根据这些数据进行图表展示

四.聚合查询-多表查询

应用场景:在后台管理中,我需要知道哪个用户看了哪篇文章或者对哪篇文章点赞
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中展示

效果

602.png

最后

暂时分享四个,后期整理下再更新内容

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值