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;
    }
  }
复制代码
相关推荐
新手村-小钻风41 分钟前
【CUDA入门·Lesson 1】Ubuntu实战:CUDA 概念、nvidia-smi 工具与 GPU 参数详解
linux·数据库·ubuntu
IndulgeCui8 小时前
【金仓数据库产品体验官】KingbaseES-ORACLE兼容版快速体验
数据库
xhbh6669 小时前
【超全汇总】MySQL服务启动命令手册(Linux+Windows+macOS)(上)
数据库·mysql·程序员·mysql启动命令·数据库启动命令
2301_8035545210 小时前
mysql(自写)
数据库·mysql
麦麦大数据11 小时前
vue+Django 双推荐算法旅游大数据可视化系统Echarts mysql数据库 带爬虫
数据库·vue.js·django·可视化·推荐算法·百度地图·旅游景点
成都极云科技11 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
学习中的程序媛~11 小时前
图数据库neo4j的安装
数据库·neo4j
喂完待续11 小时前
【Big Data】AI赋能的ClickHouse 2.0:从JIT编译到LLM查询优化,下一代OLAP引擎进化路径
大数据·数据库·clickhouse·数据分析·olap·big data·序列晋升
柏油12 小时前
MySQL InnoDB 架构
数据库·后端·mysql
10km13 小时前
jsqlparser(六):TablesNamesFinder 深度解析与 SQL 格式化实现
java·数据库·sql·jsqlparser