# 数据库

分类:

  • 关系型数据库:mysql、SqlServer、db2、oracle
  • 非关系型数据库:MongoDB、Redis

# 一、MongoDB 基础

  个人推荐使用绿色免安装版 (opens new window)(默认端口号:27017)。关于环境变量就暂时不用配置了,直接在 MongoDB 数据库的 bin 目录打开终端操作即可。

① 启动服务端(mongod.exe):

准备工作:

  • 在任意目录下创建 data 文件夹,内含两个文件夹 db 和 log ,其中 log 文件创建一个 mongodb.log 文件

  • 根目录新建 mongod.conf

dbpath = D:\install_pack\mongodb\data\db
logpath = D:\install_pack\mongodb\data\log\mongodb.log
logappend = true
port = 27017

正式启动:

.\mongod.exe --config=D:\install_pack\mongodb\mongod.conf

.\mongod.exe

② 启动客户端(mongo.exe):

.\mongo.exe #(默认直接连接,无需身份验证)

③ 可视化客户端

  • Robo 3T (Robomong)

# 1、数据库、聚集集合操作

# 展示所有数据库
show dbs
# 展示当前数据库
db

# 创建/切换数据库
use <数据库名>
# 删除数据库
db.dropDatabase()
# 展示所有集合
db.getCollectionNames()

# 创建集合
db.createCollection('<集合名>')
# 删除集合
db.<集合名>.drop()

# 2、数据的增、删、改

# 查询当前🚩集合的所有记录
db.<集合名>.find()
# 增
db.<集合名>.save([{username:'zhangsan',password:123},{username:'lisi',password:456}])

# 删除指定记录
db.<集合名>.remove({username:'lisi'})
# 删除所有记录
db.<集合名>.remove({})

# 改
db.<集合名>.update({username:'lisi'},{username:'lisi_pro',password:888})
db.<集合名>.update({username:'lisi'},{$set:{password:666}})

# 3、数据的查

# 查询当前🚩集合的所有记录
db.<集合名>.find()
# 1、指定范围
db.<集合名>.find({ag:22 })
db.<集合名>.find({age:{$gt:22} })
db.<集合名>.find({age:{$gte:22} })  >=
db.<集合名>.find({age:{$lt:22} })
db.<集合名>.find({age:{$lte:22} })  <=

db.<集合名>.find({age:{$gt:22, $lt:35} })

# 2、指定内容
# and
db.<集合名>.find({username:'lencamo', age:23})
# or
db.<集合名>.find($or:[{username:'lencamo', age:23}])

# 3、其他
db.<集合名>.find().limit(5)
db.<集合名>.find().skip(5)

db.<集合名>.find().count()

# 二、MongoDB 与 Node.js

# 1、安装

npm i mongoose

# 2、连接 MongoDB

  • 新建 config / db.config.js
const mongoose = require('mongoose')

// 建立MongoDB连接(当插入数据时,它会自动✨创建ren_db数据库)
mongoose.connect('mongodb://127.0.0.1:27017/ren_db')
  • bin / www
// 引入数据库模块
require('../config/db.config.js')

# 3、创建 MongoDB 模型

一个模型(user)对应 MongoDB 数据库中的一个集合(users)

使用:user.create、user.find、user.delete、user.update

  • 新建 model / userModel.js
const mongoose = require('mongoose')

// 准备
const Schema = mongoose.Schema
const UserType = {
  username: String,
  password: String,
  age: Number
  phone: String,
}

// 执行到user模型时,它会自动对应✨、创建users集合
const userModel = mongoose.model('user', new Schema(UserType))

module.exports = UserModel

# 三、调用 MongoDB 模型

# 1、示例

  • app.js
const usersRouter = require('./router/usersRouter')

app.use('/api', usersRouter)
  • router / usersRouter.js
// 导入user模型(这样就可以🚩使用user.create | user.find | user.delete | user.update来操作数据了)
const UserModel = require('../model/UserModel')

router.post('/user/add', (req, res) => {
  console.log(req.body)

  // 直接操作数据库  ✖(复杂)
  // db.users.【……】

  // 通过user模型 ✔
  // UserModel.【……】
})
  • index.ejs
<body>
  <div>
    <div>用户名:<input id="username" /></div>
    <div>密码:<input type="password" id="password" /></div>
    <div>年龄:<input type="number" id="age" /></div>
    <div>手机号:<input id="phone" /></div>
  </div>
  <div>
    <button id="register">注册</button>
    <button id="delectable">删除</button>
    <button id="update">更新</button>
    <button id="checkup">查询</button>
  </div>

  <br />

  <tbody>
    <thead>
      <tr>
        <td>id值</td>
        <td>用户名</td>
        <td>手机号</td>
      </tr>
      <!-- 数据区域 -->
    </thead>
  </tbody>
</body>

# 2、增

  • 前端
<script>
  // 1、注册(增)
  register.onclick = () => {
    fetch('api/user/add', {
      method: 'POST',
      body: JSON.stringify({
        username: username.value,
        password: password.value,
        age: age.value,
        phone: phone.value
      }),
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then((res) => res.json())
      .then((res) => {
        console.log(res)
      })
  }
</script>
  • 后端
router.post('/user/add', (req, res) => {
  // console.log(req.body)
  // ✨前端传来的数据(采用解构赋值:前端和后端字段命名一致)
  const { username, password, age, phone } = req.body

  UserModel.create({
    username,
    password,
    age,
    phone
  }).then((data) => {
    // 打印添加的数据
    console.log(data)

    res.send({
      ok: 1
    })
  })
})

# 3、删

  • 前端
<script>
  // 1、注册(增)
  delectable.onclick = () => {
    fetch('api/user/delectable/4563456345632345fad1')
      .then((res) => res.json())
      .then((res) => {
        console.log(res)
      })
  }
</script>
  • 后端
router.get('/user/delectable/:id', (req, res) => {
  // console.log(req.body)
  const { username, password, age, phone } = req.body

  // ✨前端传来的动态id值
  // (这里命名一定要为_id,因为MongoDB集合中默认的id字段名为_id,这样方便后面使用解构赋值)
  const _id = req.params.id

  UserModel.deleteOne({ _id }).then((data) => {
    console.log(data)

    res.send({
      ok: 1
    })
  })
})

# 4、改

  • 前端
<script>
  update.onclick = () => {
    fetch('api/user/update/4563456345632345fad1', {
      method: 'POST',
      body: JSON.stringify({
        username: 'lencamo',
        password: '123456',
        age: 21,
        phone: 13653688245
      }),
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then((res) => res.json())
      .then((res) => {
        console.log(res)
      })
  }
</script>
  • 后端
router.post('/user/update/:id', (req, res) => {
  console.log(req.body)
  const { username, password, age, phone } = req.body
  const _id = req.params.id

  UserModel.updateOne(
    { _id },
    {
      username,
      password,
      age,
      phone
    }
  ).then((data) => {
    console.log(data)

    res.send({
      ok: 1
    })
  })
})

# 5、查

① 示例 1:

  • 前端
<script>
  // 获取数据(查)
  checkup.onclick = () => {
    // 1、所有数据
    fetch('api/user/list')
      .then((res) => res.json())
      .then((res) => {
        console.log(res)
        var tbody = document.querySelector('tbody')

        // map 映射
        tbody.innerHTML = res
          .map(
            (item) => `
          <tr>
            <td>${item._id}</td>
            <td>${item.username}</td>
            <td>${item.phone}</td>
          </tr>
        `
          )
          .join('')
      })
</script>
  • 后端
router.post('/user/list', (req, res) => {
  console.log(req.body)

  // 按照age正序排列、并且只返回用户名和电话号码数据
  UserModel.find({}, ['username', 'phone'])
    .sort({ age: 1 })
    .then((data) => {
      console.log(data)

      res.send({
        ok: 1
      })
    })
})

② 示例 2:

  • 前端
<script>
  // 获取数据(查)
  checkup.onclick = () => {
    // 2、条件数据
    fetch('api/user/list?page=1&limit=10')
      .then((res) => res.json())
      .then((res) => {
        console.log(res)
      })
  }
</script>
  • 后端
router.post('/user/list', (req, res) => {
  console.log(req.body)

  // 获取请求🚩参数
  console.log(req.query)
  const { page, limit } = req.query

  // 按照age正序排列、并且只返回用户名和电话号码数据
  UserModel.find({}, ['username', 'phone'])
    .sort({ age: 1 })
    .skip((page - 1) * limit)
    .limit(limit)
    .then((data) => {
      console.log(data)

      res.send({
        ok: 1
      })
    })
})
更新于 : 8/7/2024, 2:16:31 PM