mongoose学习

235 阅读5分钟

数据库分类:

关系型数据库:Mysql、oracle、OB2、SQL server

文档型数据库:Mongodb

内存型数据库:Redis

MongoDB在CMD命令行中的基本使用
    概念:它是一个文档型数据库,它没有表这样的概念;只有集合概念,数据都是以json对象的形式进行存储;集合可以存储任意字段和数据类型的数据。
    a、帮助方法的使用
        全局help命令,可以查看Mongodb数据库的全局命令
        db 是指当前Mongodb对象
        db.help() 数据库的帮助方法
        db 是指具体的业务数据库对象,mycoll 在业务数据库中自定义的集合名字
        db.mycoll.help()
        
        show dbs 展示当前mongodb中所有的业务数据库名字
        show collections 展示当前业务数据库中的所有集合名字,一定要设置当前业务数据库
        use db_name 设置db_name这个业务数据库为当前业务数据库对象
    b、查看数据库常用方法
        在Mongodb中不需要新增数据库和集合,直接use会动态的去占用的一个空间,而且这个空间如果没有数据,那么它不会存在;
        集合只需要往里边写入数据,那么数据库和集合会自动创建
    c、数据新增、查询
        db.user_info.insertOne({id: 'admin', name: 'admin', age: 20, sex: '男'})
        db.user_info.insertMany([{"id":"admin0","name":"admin0","age":21,"sex":"男"},{"id":"admin1","name":"admin1","age":22,"sex":"男"},{"id":"admin2","name":"admin2","age":23,"sex":"男"},{"id":"admin3","name":"admin3","age":24,"sex":"男"},{"id":"admin4","name":"admin4","age":25,"sex":"男"}])
        db.user_info.find()

1、MongoDB在CMD命令行中的基本使用 -- 在集合中有一个_id字段,是Mongodb自动添加的唯一标识,不要去修改

​
    d、数据修改
        db.user_info.update({id: 'admin0'}, {sex: '女'}) 它是精确匹配,然后重置对象
        db.user_info.update({}, {sex: '女'}) 把数据全部改为传递第二个参数,他会匹配第一条数据
    e、数据删除
        db.user_info.deleteOne({sex: '男'}) 如果是要删除,一般是遍历删除,不允许批量删除,会删除匹配到的第一条数据
        db.user_info.deleteMany({sex: '女'}) 删除多条
    f、数据条件查询 -- db.user_info.find([query],[fields])
        db.user_info.find({age: 22}) 年龄为22岁的用户信息
        要查询年龄要大于或则小于多少的用户数据
            db.user_info.find({age: {$gt: 22}}) 大于
            db.user_info.find({age: {$gte: 22}}) 大于等于
            db.user_info.find({age: {$gte: 22, $lt: 24}})
        设置返回字段 -- fields中设置为0表示不返回字段,1表示要返回的字段
            db.user_info.find({}, {id: 0, name: 0})
            db.user_info.find({}, {id: 1, name: 1, _id: 0})
​
​

2、用户数据模型设计

    数据模型是把真实世界中的事物抽象成一个数据对象
    用户数据模型:用户在数据库中如何存在
        {
            id: 唯一键,
            name: String,
            age: Number,
            sex: Number, 1、0
            phone: String,
            email: String,
            address: String,
            brithday: Date,
            date: Date
        }

mongoose是一个ODM(object document mapping对象到文档数据的一个映射) 映射框架

项目流程:

a、mkdir

b、npm init -y

c、修改package.json和readme

d、新建index.js

e、安装依赖 express mongoose

f、引入框架、实例化

g、监听端口启动服务

h、做一个静态服务器

h0、新建一个静态文件夹用于放置静态文件(html,html中使用的js,html使用图片,html使用的css)

h1、新建一个login.html TODO

h2、使用中间件(express.state(root path))来定义文件夹为一个静态资源包

i、使用get(path, handler: (req, res) => void))方法来定义接口

3、mongo数据库连接,以及增删改查操作

/**
 * @author hengxin.ye
 * @time 2022-03-29
 * @description 项目入口文件
 */
const express = require('express')
const app = express()
​
// static(root: string, options?: serveStatic.ServeStaticOptions)
​
app.use(express.static('public', { index: 'login.html' }))
​
​
//连接数据库并建立数据模型
const Mongoose = require('mongoose')
​
    // connect(uri: string, callback: Mongoose.CallbackWithoutResult): void
    // uri 应该是一个连接地址:mongodb://127.0.0.1:27017/业务数据库名字Mongoose.connect('mongodb://localhost:27017/music_server', (err) => {
    if (!!err) {
        console.log('-----------数据库连接失败')
    } else {
        console.log('---------数据库连接成功')
​
    }
​
})
​
//数据模型的具体描述
const userSchema = new Mongoose.Schema({
        id: Number,
        name: String,
        password: String,
    })
    //数据模型
const UserModel = Mongoose.model('UserModel', userSchema, 'user_info')
​
//查询的接口
app.get('/user/list', (req, res) => {
    // find(callback?: Mongoose.Callback<any[]>)需要一个回调方法,然后返回有一个形参
    // find(filter: Mongoose.FilterQuery, callback?: userModel.Callback<ResultDoc[]>)
    //需要FilterQuery查询条件参数,callback回调方法,然后返回有一个形参。
​
    UserModel.find(({ name: 'zs' }), function(err, result) {
        if (!!err) {
            console.log(err)
            res.send({ code: 500, message: '服务器错误' })
        } else {
            res.send({ code: 200, message: 'success', data: result })
        }
    })
})
// 删除接口 -- 只需要一个id参数,然后返回一个是否成功
// 可以再地址上进行参数传递,可以使用query参数;
// 是否可以直接用地址进行参数传递 -> 地址是动态的,它由固定地址和动态id参数组成 -> 动态路由
// 定义的时候,需要把动态字符串,用户:key进行拼接
// 前端在使用的时候,需要:id替换为你要传递的参数。
// 例如:/user/:id 在进行接口请求的时候,用户编码为admin0 => 变为/user/admin0
app.delete('/user/:id', (req, res) => {
    // 在地址中以?传递的参数:使用req.query
    // 在请求体中传递的参数:使用req.body
    // 动态路由参数:使用req.params => 这个也是一个对象
    UserModel.deleteOne({id: req.params.id}, err => {
        if (!!err) {
            res.send({code: 500, message: '服务器错误'})
        } else {
            res.send({code: 200})
        }
    })
    // console.log(req.params)
    // res.send({code: 200, id: req.params})
})
//添加接口
app.put('/user/add', (req, res) => {
    let data = req.body
​
    // 写入到数据库
    // 在进行数据保存的时候,需要实例化数据模型
    const user = new UserModel(data)
    user.save(err => {
        if (!!err) {
            res.send({code: 500, message: '服务器错误'})
        } else {
            res.send({code: 200})
        }
    })
})
//修改接口
app.post('/user/update', (req, res) => {
    let data = req.body
    UserModel.updateOne({id: data.id}, {$set: data}, err => {
        if (!!err) {
            res.send({code: 500, message: '服务器错误'})
        } else {
            res.send({code: 200})
        }
    })
})
app.listen(8088, function() {
    console.log('-------服务器启动')
})

\