一、MongoDB简介
关系型数据库和非关系型数据库
1.关系型数据库
- sql语句增删改查
- 保持事务的一致性,事务机制(回滚) myaql,sqlserver,db2, oracle
2.非关系型数据库
- no sql,not only sql
- 轻量,高效,自由
mondodb,hbase,redis
mongodb的优点
由于mongodb独特的处理数据的方式,可以将热点数据加载到内存,因此对查询来讲,会很快(因此也很消耗内存)
同时由于采用了BSON的方式存储数据,故而对JSON数据格式具有非常好的支持性和表结构修改性
文档式的存储方式,数据友好可见
数据库的分片集群负载具有非常好的扩展性以及非常不错的自动故障转移
二、RESTful接口规范
服务器上每一种资源,比如一个文件,一张图片,一部电影,都有对应的url地址,如果我们的客户端需要对服务器上的这个资源进行操作,就需要通过http协议执行相应的动作来操作它,比如进行更新/获取/删除等。
简单来说就是: url地址中只包含名词表示资源,使用http动词表示动作进行操作资源
常见的动词: get,post,put,delete等
举个例子:
GET /blog/article //获取所有文章
POST /blog/article // 添加一篇文章
PUT /blog/article // 修改一篇文章
DELETE /blog/article/1 //删除一篇文章
三、操作MongoDB
1.连接数据库
链接数据库需要安装mongoose插件,执行以下命令
npm i mongoose
安装完以后进入express-app\myapp\bin\www文件,这个是express项目的全局配置,在当前目录中,引入刚才安装的mongoose:
// 数据库配置
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/login')
[注]: 利用mongoose的connect方法链接数据库,后面的参数’mongodb://'是固定的,后面写数据库的地址,27017是mongodb服务的默认端口,后面的login代表在数据库中会重新创建一个表local,但是前提条件是向login中添加集合和数据
判断是否连接成功: 等待一段时间后看终端会不会报超时的错误,如果出错需要重新检查配置。
2.定义mongodb的模型:
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const UserType = new Schema({
username: String,
password: String,
age: Number
})
const UserModel = mongoose.model('user',UserType)
module.exports = UserModel
3. 完成前端代码书写,写一个简单的页面实现调用后端接口的需求
在安装express的时候,我指定的模板引擎是ejs
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>MongoDB</h1>
<div>
<div>用户名:<input id="username"/></div>
<div>密码:<input type="password" id="password"/></div>
<div>年龄:<input type="number" id="age"/></div>
<div><button id="register">注册</button></div>
<div><button id="update">更新</button></div>
<div><button id="deleteBtn">删除</button></div>
<br/>
<table>
<thead>
<tr>
<td>id</td>
<td>同户名</td>
<td>年龄</td>
</tr>
</thead>
<tbody></tbody>
</table>
<div>
<script>
const register = document.querySelector("#register")
const username = document.querySelector("#username")
const age = document.querySelector("#age")
const password = document.querySelector("#password")
const deleteBtnBtn = document.querySelector("#deleteBtn")
const update = document.querySelector("#update")
// 注册事件
register.onclick = () => {
console.log(username.value,password.value,age.value)
fetch("api/user",{
method:"POST",
headers:{
"Content-Type":"application/json"
},
body: JSON.stringify({
username: username.value,
password: password.value,
age: age.value
})
}).then(res => res.json()).then(res => {
console.log(res)
})
}
// 更新事件
update.onclick = () => {
fetch("api/user/64e983876f9410f2d712ddf1",{
method:"PUT",
headers:{
"Content-Type":"application/json"
},
body: JSON.stringify({
username: username.value,
password: password.value,
age: 1
})
}).then(res => res.json()).then(res => {
console.log(res)
})
}
// 删除事件
deleteBtnBtn.onclick = () => {
fetch("api/user/64e983876f9410f2d712ddf1",{
method:"DELETE"
}).then(res => res.json()).then(res => {
console.log(res)
})
}
// 查询事件 获取列表
fetch('/api/user?page=1&limit=2').then(res => res.json()).then(res => {
console.log(res)
const tbody = document.querySelector("tbody")
tbody.innerHTML = res.map(item => `
<tr>
<td>${item._id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
`).join('')
})
</script>
</body>
</html>
前端的代码很简单,就是利用fetch去请求后端数据,传递输入框的参数,这里的url是结合接口规范写的。
4.实现后端接口
var express = require('express');
var router = express.Router();
const UserModel = require('../models/UserType')
router.post('/user', function (req, res, next) {
const {username, password, age} = req.body
UserModel.create({
username,
password,
age
}).then(data => {
console.log({data})
res.send({
code: 0,
message: '',
data: null
})
})
});
// 动态路由配置获取前端传递的参数
router.put('/user/:id', function (req, res, next) {
console.log(req.params)
const {username, password, age} = req.body
UserModel.updateOne({_id: req.params.id}, {
username,
password,
age
}).then(data => {
console.log({data})
res.send({
code: 0,
message: '',
data: null
})
})
});
//删除事件
router.delete('/user/:id', function (req, res, next) {
const {username, password, age} = req.body
UserModel.deleteOne({_id: req.params.id}).then(data => {
console.log({data})
res.send({
code: 0,
message: '',
data: null
})
})
});
// sort: 1是正序排序,-1是倒序排序
// skip表示跳过多少条数据,limit表示每页返回多少条
router.get('/user', (req, res) => {
const {page, limit} = req.query
UserModel.find({}, ["username", 'age']).sort({age: 1})
.skip((page - 1) * limit).limit(limit).then(data => {
res.send(data)
})
})
module.exports = router;
在后端接口中,请求方法决定了要调用router的哪种方法,而操作mongodb的增删改查方法分别是 ;create, delete,update,find,其中可以批量编辑和批量删除。
最后用可视化工具查看一下:
好啦 就先记录到这里。