mongoDB初始化项目简单操作示例
npm install koa koa-json koa-bodyparser @koa/router @koa/cors mongoose
# 快速配置项目
- npm install -g koa-generator
koa2 /目录 && ce /目录
# 配置路由等
- npm install @koa/router
```javascriptconst 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
// 1. 引入koa-art-templateconst 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
const static = require('koa-static')// 静态资源app.use(static(__dirname + '/views/static'))
设置cookie
ctx.cookies.set('userInfo', Buffer.from(JSON.stringify(ctx.state)).toString('base64'), {maxAge: 1000 * 60 * 5, // 过期时间domain: '.xxx.com' // 二级域名共享cookie})
获取cookie
Buffer.from(ctx.cookies.get('userInfo'), 'base64').toString()
session使用
- npm install koa-session
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))// 设置sessionctx.session.username = 'xx'// 获取ctx.session.username
配置公共中间件
// 我们需要在每个路由的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();
// $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: truedb.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 等于给定值
// 多个表查询 创建多个$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 的时候指定创建索引
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
phone:{type:Number,match: /^\d{11}$/},desc: {type: String,// 自定义的验证器,如果通过验证返回true,没有通过则返回falsevalidate: function(desc) {return desc.length >= 10;}}