Mongodb学习笔记之增删改查操作

同步异步问题

  • 首先几乎所有的操作都需要异步操作,所以在操作前使用async await能避免很多错误
//获取用户列表
exports.getuserList =  async(req,res)=>{
	 let userList = await User.find()//获取全部用户
	  const user =  await User.findById(id.toString()).select(filterStr)//获取个别用户
}

数据模型封装与校验

  • 数据模型
const mongoose = require("mongoose")
const joi = require('@hapi/joi')
const config = require("../config")
const jwt = require('jsonwebtoken')
joi.objectId =require("joi-objectid")(joi)

const userSchema  = new mongoose.Schema({
    email:{
        type:String,
        required:true,
        minlength:6,
        maxlength:20,
        unique:true
    },
    name:{
        type:String,
        required:true,
        minlength:2,
        maxlength:20,
       
    },
    password:{
        type:String,
        required:true,
        minlength:6,
        maxlength:100,
        select:false //请求的时候不展示
    },
    })

//挂载用户数据模型
const User = mongoose.model("User",userSchema)


//封装用户校验信息
const userValidator =(data)=>{
 const schema = joi.object({
      email:joi.string().email().trim().lowercase().min(6).max(20).required(),
        name:joi.string().min(4).max(10).required(),
        password:joi.string().pattern(/^[a-zA-Z0-9]{6,1000}$/).required(),
        _id:joi.objectId(),
   })

    return schema.validate(data)
}


//可以顺便写入JWT的验证
userSchema.methods.generateToken = function(){
    return jwt.sign({
        _id:this._id
    },config.secret,{expiresIn:'1h'})
}
//导出
module.exports ={User,userValidator}

封装验证请求模块

module.exports =(validator)=>{
    return (req,res,next)=>{
        const {error,value} = validator(req.body)
        if(error) return res.send({status:400,original:error._original,err:error.details[0].message})
        req.validator =value
        next()
    }
}
  • 导入并使用验证
const express = require('express')
const router = express.Router()
const {userValidator} = require('../model/user')
const validator = require('../middleware/validator')
const user = require('../controller/user')

//校验中间件
const auth  = require('../middleware/auth')
const checkUser = require('../middleware/checkUser')

//注册
router.post("/user",validator(userValidator),user.register)

Mongodb语法学习

const data = await User.findByIdAndDelete({_id:id.toString()})//根据Id删除选项
let user = await User.findOne({email})//返回第一个找到的数据
const user =  await User.findById(id.toString()).select(filterStr)//传入对应的id并且显示对应的选项
const data = await User.findByIdAndUpdate({_id:id.toString()},body)//根据ID修改用户,后面跟上修改后的值
const user = await User.findById(userId.toString()).select("+following").populate("following")//获取关联数据
 const Totalcount = await Topic.find().count()//显示数据总数
const topicList = await Topic.find({name:{$regex:req.query.keyword,$options:"$i"}}).limit(pageCount).skip(page  * pageCount)//通过find来进行模糊查询
  users = new User({ //写入数据
            name,
            email,
            password,
        })
        //保存数据到数据库
        await users.save()

查询条件符号

  • 符号:$ne (不等于)
user.find({name:{$ne:'java'}) //name不等于java的
  • $gt(大于) $gte(大于等于) $lt(小于) $lte(小于等于)
user.find({age: {$gt:13}})//年龄大于13的值
  • $in $nin
user.find({name:{$in:'李四'}})//包含李四
user.find({name:{$in:['王五,李四']}})//包含李四和王五
  • $all(全包含)
user.find({user:{$all:["夏利","王五"]}})//

模糊匹配

  • /^X/ (左匹配)
  • /X$/(右匹配)
user.find({name:/王$/})//以王结尾
user.find({name:/李$/})//以李开头
  • /X/ (模糊匹配)
user.find({name:/橘子/}) //包含橘子的所有集合
  • /^X$/(全匹配)
user.find({name:/^绝绝子$/}) //name中只有绝绝子三个字的所有集合

  • i 不区分大小写
user.find({from:/a/i})//不区分a的大小写
user.find({name:{$regex:req.query.keyword,$options:"$i"}})//关键字不区分大小写
  • $exists 存在字段
user.find({author:{$exists:true}})//查询存在字段的文档
user.find({author:{$exists:false}})//查询不存在字段的文档
  • $type 字段类型
user.find({age:{$type:1}})//查询字段为1:string类型可以是枚举
user.find({age:{$type:2}})//查询字段为2:number类型
  • $size(长度)
  • $elemMatch(子查询)
user.find({author:{$elemMatch:{authorName:"小李"}}})
user.find({author.authorName:"王强"}) 
//查询author.authorName = 小李 的数据
  • 正则表达式
user.find({age:{$regex:"O"}}) //age中包含 字母大写 O的数据,区分大小写
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值