mongoDB初始化项目简单操作示例

javascript 复制代码
npm install koa koa-json koa-bodyparser @koa/router @koa/cors mongoose
# 快速配置项目
- npm install -g koa-generator
koa2 /目录 && ce /目录
# 配置路由等
- npm install @koa/router
```javascript
  const router = require('@koa/router')();
  const json = require('koa-json') // 用于将http响应的数据转换为json格式
  const bodyParser = require('koa-bodyparser') // 解析http请求的消息体
  const cors = require('@koa/cors') // 允许跨域
  // 使用路由
  router.get('/', async (ctx) => {});
  // 注意顺序 不让post请求拿不到body参数
  app.use(bodyParser())
  app.use(cors())
  app.use(json())
  app.use(router.routes()).use(router.allowedMethods())

配置模板

  • npm install koa-static
javascript 复制代码
  // 1. 引入koa-art-template
  const render = require('koa-art-template');
  // 2. 配置art-template模板引擎
  render(app, {
      root: path.join(__dirname, 'views'), // 视图的位置
      extname: '.html', // 后缀名
      debug: process.env.NODE_ENV !== 'production' // 是否开启调试模式
  });

配置静态资源

  • npm install koa-static
javascript 复制代码
  const static = require('koa-static')
  // 静态资源
  app.use(static(__dirname + '/views/static'))

设置cookie

javascript 复制代码
  ctx.cookies.set('userInfo', Buffer.from(JSON.stringify(ctx.state)).toString('base64'), {
    maxAge: 1000 * 60 * 5, // 过期时间
    domain: '.xxx.com' // 二级域名共享cookie
  })

获取cookie

javascript 复制代码
  Buffer.from(ctx.cookies.get('userInfo'), 'base64').toString()

session使用

  • npm install koa-session
javascript 复制代码
  const session = require('koa-session')
  app.keys = ['travel keys']
  const CONFIG = {
      key: 'koa.somename',
      maxAge: 1000 * 60 * 60 * 24,
      rolling: true, /** 每次请求重新设置时间*/
      renew: false, /** 请求时在快要过期时重新设置cookie*/
      secure: false /* 是否只允许htts里面设置cookie */
  }
  app.use(session(CONFIG, app))
  // 设置session
  ctx.session.username = 'xx'
  // 获取
  ctx.session.username

配置公共中间件

javascript 复制代码
  // 我们需要在每个路由的render中都渲染一个公共的数据
  // 写一个中间件配置公共信息
  app.use(async (ctx, next) => {
      // 匹配路由之前 可以进行权限判断等操作
      // 公共的数据要放在ctx.state中
      ctx.state = {
          userinfo: '李四',
          age: '18',
      }
      await next()
      // 错误处理 找不到路由时
      if (ctx.status === 404) {
          ctx.body = '404:页面没有找到'
      }
  })

mongo 7.0之后 连接mongo需要下载mongosh 配置环境变量

  • D:\mongosh-2.1.1-win32-x64\bin
    cmd mongosh
  • C:\Program Files\MongoDB\Server\7.0\bin
  • 表操作
    • 查看表 show dbs
    • 新建/使用表 use dbname
      • 新建表需要插入数据才会显示 db.user.insert({'':''})
    • 查看集合 show collections
    • 删除集合 db.user.drop()
    • 删除数据库,删除当前所在的数据库 db.dropDatabase();
    • 查看所有记录 db.user.find();
javascript 复制代码
    // $gt:大于
    // $lt:小于
    // $gte:大于等于
    // $lte:小于等于
    // $ne:不等于
    // $in:包含于
    // $nin:不包含于
    // $regex:正则表达式匹配
    db.user.find({ username: { $in: ['Luolei']}})
    // 更新
    // 1.findOneAndUpdate()更新符合条件的第一条文档 name为张三的更新为李四,只更新第一条
    db.user.findOneAndUpdate({ name: '张三' }, { name: '李四' })
    // 2.updateMany()更新所有符合条件的文档 使用updateMany更新多条文档
    db.user.updateMany({ name: '张三' }, { name: '李四' })
    
    // 3.updateMany()深度更新字段
    // 假如name是个嵌套对象字段,比如:
    // {name:{a:{b:{c:'张三'}}}}
    // //使用.和$set来深度更新
    db.user.updateMany({ 'name.a.b.c': '张三' }, { $set: { 'name.a.b.c': '李四' } })
    // 批量添加
    db.user.create([{}])
    // 删除
    db.user.deleteMany({age:{$gt:10}})
    // 查询name 中包含mongo 的数据模糊查询用于搜索
    db.user.find({name: /mongo/});
    // 查询name 中以mongo 开头的
    db.user.find({name: /^mongo/});
    // 升序:
    db.user.find().sort({age: 1});
    // 降序:
    db.user.find().sort({age: -1});
    // 可用于分页,limit 是pageSize,skip 是(page-1)*pageSize
    // 查询前5 条数据
    db.user.find().limit(5);
    // 查询10 条以后的数据
    db.user.find().skip(10);
    // 查询在5-10 之间的数据
    db.user.find().limit(10).skip(5);
    // or 与查询
    db.user.find({$or: [{age: 22}, {age: 25}]});
    // 查询某个结果集的记录条数 统计数量
    db.user.find({age: {$gte: 25}}).count();
    // 如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
    db.users.find().skip(10).limit(5).count(true);
    // 修改数据
    db.users.update({"name":"小明"},{$set:{"age":16}});
    // 批量修改multi: true
    db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true});
    // 完整替换,不出现$set 关键字了: 注意
    db.users.update({"name":"小明"},{"name":"大明","age":16});
    // 删除数据
    db.users.remove({age: 132});

提高数据库查询速度

查询userame时 给userame创建索引

  • 创建索引的命令
    db.user.ensureIndex({"userame":1})
  • 获取当前集合的索引:
    db.user.getIndexes()
  • 删除索引的命令是:
    db.user.dropIndex({"username":1})
    创建复合索引
  • 数字1 表示username 键的索引按升序存储,-1 表示age 键的索引按照降序方式存储。
    db.user.ensureIndex({"username":1, "age":-1})
    查询具体的执行时间
  • explain executionStats
    db.tablename.find().explain("executionStats")
    唯一索引
  • 创建唯一索引后,userid不能插入相同的数据
    db.user.ensureIndex({"userid":1},{"unique":true})

MongoDB 的高级查询aggregate 聚合管道

  • $project 增加、删除、重命名字段
  • $match 条件匹配。只满足条件的文档才能进入下一阶段
  • $limit 限制结果的数量
  • $skip 跳过文档的数量
  • $sort 条件排序。
  • $group 条件组合结果统计
  • $lookup 用以引入其它集合的数据(表关联查询)
    常用表达式操作
  • $addToSet 将文档指定字段的值去重
  • $max 文档指定字段的最大值
  • $min 文档指定字段的最小值
  • $sum 文档指定字段求和
  • $avg 文档指定字段求平均
  • $gt 大于给定值
  • $lt 小于给定值
  • $eq 等于给定值
javascript 复制代码
// 多个表查询 创建多个$lookup 关联主表就行
db.order.aggregate([
  {
    $lookup: {
      from: "order_item", // 副表
      localField: "order_id", // 主表关联字段
      foreignField: "order_id", // 副表关联字段
      as: "items" // 返回集合键值
    }
  },
  {
    $project:{ trade_no:1, all_price:1,items:1 } // 过滤字段 只显示这几个字段
  },
  {
    $match:{"all_price":{$gte:90}} // 查找all_price 大于等于90
  },
  {
    $sort:{"all_price":-1} // 按照all_price 降序
  },
])

数据库备份

  • mongodb数据库导出备份语法:

    mongodump -h dbhost -d dbname -o dbdirectory

    参数说明:

    -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

    -d: 需要备份的数据库实例,例如:test

    -o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。

  • mongodb数据库恢复导入语法:

    mongorestore -h dbhost -d dbname dbdirectory

    参数或名:

    -h: MongoDB所在服务器地址

    -d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

    --drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!

  • mongodb数据库有用户名密码认证的参考下面命令

    mongodump -h 127.0.0.1:27017 -d test -u test -p testpwd -o D:\dump

    mongorestore -h 127.0.0.1:27017 -d test -c order --dir d:\dump\test\test.bson -u test -p testpwd

定义Schema 的时候指定创建索引

javascript 复制代码
var DeviceSchema = new mongoose.Schema({
  sn: {
    type: Number,
    // 唯一索引
    unique: true
  },
  name: {
    type: String,
    // 普通索引
    index: true
  }
})

校验参数

  • 内置
    required : 表示这个数据必须传入
    max: 用于Number 类型数据,最大值
    min: 用于Number 类型数据,最小值
    enum:枚举类型,要求数据必须满足枚举值enum: ['0', '1', '2']
    match:增加的数据必须符合match(正则)的规则
    maxlength:最大值
    minlength:最小值
  • 自定义 validate
javascript 复制代码
  phone:{
    type:Number,
    match: /^\d{11}$/
  },
  desc: {
    type: String,
    // 自定义的验证器,如果通过验证返回true,没有通过则返回false
    validate: function(desc) {
      return desc.length >= 10;
    }
  }
复制代码
相关推荐
极限实验室1 小时前
ES 踩坑记:Set Processor 字段更新引发的 _source 污染
数据库
regret~3 小时前
【记录】Ubuntu20.04安装mysql
数据库·mysql
机器视觉知识推荐、就业指导4 小时前
51单片机基础知识讲解
嵌入式硬件·mongodb·51单片机
见未见过的风景4 小时前
想删除表中重复数据,只留下一条,sql怎么写
数据库·sql
哆啦A梦的口袋呀5 小时前
pymongo库:简易方式存取数据
数据库·mongodb
城里有一颗星星6 小时前
6.删除-demo
数据库·go
失重外太空啦6 小时前
Mysql练习
android·数据库·mysql
像风一样自由20206 小时前
Navicat操作指南:MySQL数据库配置与Todo应用部署
数据库·mysql·adb
青竹易寒7 小时前
Redis技术笔记-从三大缓存问题到高可用集群落地实战
数据库·redis·笔记