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: 1
userName,
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)
}
})
乐观锁
在多请求同时修改数据库中的数据时,会影响数据最终的修改结果
在请求时获取到数据库中的数据 在修改时要先比较查询的数据是否被更改 再进行修改
如果在请求获得数据和修改的间隔中数据被修改 就修改失败
悲观锁
在多请求也同时修改数据库中的数据时,先将数据库锁住,不让其他用户进行修改