Mongoose

Mongoose为模型提供了一种直接的,基于scheme结构去定义你的数据模型。

它内置数据验证, 查询构建,业务逻辑钩子等

Mongoose连接Mongodb数据库

// 创建db.js用于连接Mongodb数据库 // 先引入mongoose模块 这个模块是为了便于对mongodb进行操作的一个类库
const mongoose = require('mongoose')// 连接数据库服务器
// mongodb:// 协议头
// 127.0.0.1 mongodb服务器的地址
// 27017 mongodb的端口
// bus 数据库名称mongoose.connect('mongodb://127.0.0.1:27017/bus', {useNewUrlParser: true,useUnifiedTopology: true
}, function (error) {if (error) {console.log('数据库连接失败')} else {console.log('数据库连接成功')}
})module.exports = mongoose

创建集合模型

// model文件夹下创建一个集合模型 collection.js// collection
const mongoose = require('mongoose')// 需要在使用mongoose.Scheme 对于这个表的对应指定进行声明
const Scheme = mongoose.Schema({  // 数据集合的表头userName: String,   // 用户名phone: String,      // 用户电话addres: String,     // 用户住址Uid: String,        // 用户身份证号码pwd: String,        // 用户密码sex: Number,        // 用户性别status: Number      // 用户注册状态
},{timestamps:true     // 设置为true会自动添加及维护两个字段 createAt updateAt
})const collection = mongoose.model('user', Scheme)module.exports = collection

Mongoose操作

// 引入对应文件const app = require('express')()         // 引入express
const db = require('./db')               // 引入Mongoose数据库连接 不需要调用 引入即可
const user = require('./collection') // 引入Mongoose集合模型

Mongoose增加数据

// 增
// model.create({...})  增加一个数据
app.use('/add', async (req, res) => {const u = await user.create({// key:value})res.send({success: true,data: u})
})

Mongoose删除数据

// 删
// model.deleteOne({...}) 删除一个数据
app.use('/delete', async (req, res) => {const u = await user.deleteOne({// key:value 删除的条件})res.send({success: true,data: u})
})// model.deleteMany({...}) 删除多个数据
app.use('/deleteall', async (req, res) => {const u = await user.deleteMany({// key:value 删除的条件})res.send({success: true,data: u})
})// model.findByIdAndDelete(' id ') 按id删除数据
app.use('/deleteid', async (req, res) => {const u = await user.findByIdAndDelete(' 数据id ')res.send({success: true,data: u})
})

Mongoose修改数据

// 改
// model.updateOne({...},{...}) 修改一个数据
app.use('/updateone', async (req, res) => {const u = await user.updateOne({// key:value 修改的条件}, {// key:value 需要修改的键和值})res.send({success: true,data: u})
})// model.updateMany({...},{...}) 修改多个数据
app.use('/updateall', async (req, res) => {const u = await user.updateMany({// key:value 修改的条件}, {// key:value 需要修改的键和值})res.send({success: true,data: u})
})// model.findByIdAndUpdate(' 数据id ', {...})
app.use('/updateid', async (req, res) => {const u = await user.findByIdAndUpdate(' 数据id ', {// key:value 需要修改的键和值})res.send({success: true,data: u})
})

Mongoose查找数据

// 查
// model.findById(' 数据id ')  通过id搜索数据
app.use('/findid', async (req, res) => {const u = await user.findById('6217192aa61d5d11970989ae')res.send({success: true,data: u})
})// model.findOne({...})  通过条件搜索一个数据
app.use('/findone', async (req, res) => {const u = await user.findOne({// key:value 搜索的条件})res.send({success: true,data: u})
})// model.find()   搜索当前集合下所有数据 返回一个数组
app.use('/findall', async (req, res) => {const u = await user.find()res.send({success: true,data: u})
})// model.find({...}) 通过find中添加搜索条件 查找所有符合条件的数据
app.use('/findname', async (req, res) => {const u = await user.find({// key:value 搜索的条件})res.send({success: true,data: u})
})
// 查
// 数据过滤
// 设置过滤属性 让查找出来的数据只显示需要的部分属性
app.use('/findfilter', async (req, res) => {const u = await user.find({}, ['属性a', '属性b'])res.send({success: true,data: u})
})// 设置过滤属性的另一种写法  属性:1为只显示该属性  属性:0为除这个属性不显示外显示其他属性
// 属性:1 与 属性:0不能一起使用 只能{ '属性a': 1, '属性b': 1} 或{ '属性a': 0, '属性b': 0}
app.use('/findfilters', async (req, res) => {const u = await user.find({}, {'属性a': 1,'属性b': 1})res.send({success: true,data: u})
})
// 查
// model.exists({...})app.use('/login',(req, res)=>{const { userName, pwd } = req.body// 判断数据库中是否有 返回布尔值const u = await user.exists({ userName })
})
// 查
// 设置修饰符用于过滤数据app.use('/findf',(req, res)=>{// 查找uid中为数组中的任意一个的数据const u = await user.find({ uid: {$in:[1,5,6,7]} })
})
// $gt $gte $lt $lte $or等
// 查
// 设置修饰符用于过滤数据app.use('/findf',(req, res)=>{// 查找uid中为数组中的任意一个的数据const u = await user.find({},{},{limit:5, // 截取的数据个数skip:5  // 偏移量 跳过的数据个数})
})

Md5加密

// 需要先引入模块
const utility = require('utility')           // 工具包 用于md5加密
const bodyParser = require('body-parser')    // 用于解析请求体 express默认自带 引入即可app.use(bodyParser.json());                  // 通过中间件挂载 解析表格和json
app.use(bodyParser.urlencoded({extended: false
}));
app.use('/md5', async (req, res) => {try {                             // 在数据库中添加数据可能会出错 使用try catch在出错时进行捕捉const {userName,phone,addres,Uid,pwd,sex} = req.body                  // 从请求体中解构出来 需要的数据const u = await user.create({    // userName: 'zs',            // 数据格式// phone: '12345671231',// addres: '这是一个地址',// Uid: '440909888909880098',// pwd: '123123',// sex: 0,// status: 1userName,phone,addres,Uid,pwd,sex,pwd: '',                 // 设置密码为空 在注册完成后再将二次加密的密码更新到pwd中status: 1})await user.findByIdAndUpdate(u.id, {         // createdAt为创建的时候的日期字符串 通过getTime()获得时间戳pwd: utility.md5(pwd + u.createdAt.getTime()) // 将用户的密码拼接上时间戳拼接起来再加密})                                                // 将加密后的密码更新到数据中res.send({success: true,data: u})} catch (error) {                                  // 出现错误时进行捕捉res.send({success: false})console.log('添加用户失败',error)}
})

乐观锁

在多请求同时修改数据库中的数据时,会影响数据最终的修改结果

在请求时获取到数据库中的数据 在修改时要先比较查询的数据是否被更改 再进行修改

如果在请求获得数据和修改的间隔中数据被修改 就修改失败

悲观锁

在多请求也同时修改数据库中的数据时,先将数据库锁住,不让其他用户进行修改

59.Mongoose相关推荐

  1. 一个关于中国省市区的字典,数组嵌套使用

    第一步: 去云盘的资料目录下下载一个名字为area.txt的文件(内容为中国的省市区),将这个文件导入到自己的工程里(导入时会有一个界面,勾选copy items if needed) //    第 ...

  2. nodejs mongoose建模实践

    2019独角兽企业重金招聘Python工程师标准>>> 一直以来mongoose学习都是比较麻烦的,mongoose-cli试图简化学习和测试mongoose部分,并通过app开发流 ...

  3. koa --- mongoose连接mongoDB

    使用Mongoose对MongoDB进行操作 const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/t ...

  4. mongoose换成mysql_Package - tms-koa

    tms-koa 基于koa的轻量级快速开发框架,包含 MVC 中的 M 和 C 两部分,适合于实现 API 服务和前后端彻底分离的应用. 内置基于 access_token 的访问鉴权机制,更容易实现 ...

  5. mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中

    FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...

  6. node.js(node.js+mongoose小案例)_实现简单的注册登录退出

    一.前言 通过node.js基本知识对node.js基本知识的一个简单应用 1.注册 2.登录 3.退出 二.基本内容 1.项目结构搭建如图所示 2.这个小案列中用到了art-template子模板以 ...

  7. mongoose手动生成ObjectId

    如果需要手动生成使用mongoose.Types.ObjectId()方法. var mongoose = require('mongoose'); var id = mongoose.Types.O ...

  8. mongoose简单使用

    介绍&安装 官网:http://www.mongoosejs.net/ npm i -S mongoose 使用 1.连接mongodb&创建模型 var mongoose = req ...

  9. node mongoose_如何使用Express,Mongoose和Socket.io在Node.js中构建实时聊天应用程序

    node mongoose by Arun Mathew Kurian 通过阿伦·马修·库里安(Arun Mathew Kurian) 如何使用Express,Mongoose和Socket.io在N ...

最新文章

  1. 2011软件设计大赛
  2. Python应用实战案例-pyspark库从安装到实战保姆级讲解
  3. wind2008中如何显示隐藏文件/夹
  4. springboot数据访问基本操作步骤
  5. IOS开发基础之使用AFNetworking框架实现文件上传get和post请求
  6. mysql分页案例_MySQL优化案例系列-mysql分页优化
  7. input属性disabled和readonly的区别
  8. 您的浏览器由所属组织管理_FB频繁被封,关于多账号环境管理的知识你掌握了吗?...
  9. ubuntu里面的任务管理器
  10. 大数据分析如何保证数据质量
  11. (三)JavaScript之[事件]与[字符串]
  12. UEFI开发探索31–鼠标GUI构建
  13. 南昊网上阅卷系统服务器地址,南昊网上阅卷系统全攻略
  14. 复杂网络研究及其前沿概述
  15. 网页可以播放RTMP视频流?支持RTMP的网页播放器
  16. VFP全面控制EXCEL
  17. 商务网站建设与维护【12】
  18. 海南新能源内容市场遇冷,本土内容平台杉车网如何解围?
  19. java post 405 错误
  20. 样本方差为何除以n-1而不是n?

热门文章

  1. 解决VSTO EXCEL 设置合并单元格锁定时报错问题
  2. C盘扩容 ~直接磁盘管理器不能扩展~bitlocker加密解除
  3. java 微信 图灵机器人,SAE服务下用java实现微信公众账号图灵机器人
  4. 心跳包机制及Socket通信服务的心跳包
  5. 概率分析和随机算法_雇佣问题
  6. 室内定位技术(三)——自有定位技术
  7. 计算机网络——BGP协议
  8. 灰色预测GM(1,1)代码
  9. 关于基于kangle和EP面板使用CDN
  10. 测试工程师面试汇总【完美世界】