# 数据库
分类:
- 关系型数据库: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
})
})
})
← mysql集成 MongoDB(koa) →