MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。使用键值对存储数据,数据没有耦合性,容易扩展;存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。MongoDB
文档:mongodb数据库的最小数据集,是由多个键值对有序组合的数据单元,类似于mysql的数据记录;
集合:集合就是 MongoDB 文档组,实质上就是包含多个对象的数组,类似于mysql的表;
数据库:数据库可以包含多个集合;每个数据库都是独立的,有自己的用户,权限,独立存储集合,类似于mysql的库;
实例:系统上运行的mongodb的进程,类似于mysql实例。
安装地址: download 安装教程大家可以另外搜索,这里就不赘述啦~
const express = require('express')
const cors = require('cors')
const app = express()
app.use(cors())// 允许跨域
app.use(express.json())
app.listen('3000', async(req, res) => {
console.log("http://localhost:3000")
})
nodemon start index.js
const mongoose = require('mongoose')
// mongoose.connect('mongodb://数据库IP地址:端口号/数据库名称')
mongoose.connect('mongodb://localhost:27017/express-test, {useNewUrlParser: true})
.then(()=>console.log('数据库连接成功'))
.catch(()=>console.log(err,'数据库连接失败'))
Schema 主要用于定义 MongoDB 中集合 Collection 里文档 document 的结构,mongoose 对表结构的定义,每个 Schema 会映射到mongodb中的一个 collection,Schema 不具备操作数据库的能力。
定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种:
String(字符串)、Number(数字)、Data(日期)、Buffer(二进制)、Boolean(布尔值)、Mixed(混合类型)、ObjectId(对象ID)、Array(数组)
const schema = new mongoose.Schema({
name: {type: String, required: true // 规定 name 是必须有的字段}
password: {type: String, required: true}
})
model是由 Schema 生成的模型,可以对数据库的操作。model的每一个实例(instance)就是一个文档。
发布为模型只需调用mongoose的 mongoose.model() 方法即可,mongoose.model() 接收两个参数,第一个参数表示模型的名称,第二个参数是 Schema,返回值为模型构造函数。
注意
// 把Schema 发布为模型
const User = mongoose.model('User', userSchema)
// 使用express实例启动项目,监听3000端口
const express = require('express')
const app = express()
app.listen(3000, () => {
console.log('http://localhost:3000');
})
1.增
app.post('/users', async (req, res) => {
// const model = await req.User.create(req.body)
const data = req.body
await User.create()
res.send(data)
})
2.删
app.delete('/users/:id', async (req, res) => {
// await req.User.findByIdAndDelete(req.params.id, req.body)
const user = await User.findById(req.params.id)
await user.remove()
res.send({
success: true
})
})
3.改
app.put('/users/:id', async (req, res) => {
// const user = await req.User.findByIdAndUpdate(req.params.id, req.body)
const user = await User.FindById(req.params.id)
user.name = req.body.name
await model.save()
res.send(name)
})
4.查
// 根据id查询数据(查)
app.get('/users/:id', async (req, res) => {
// const user = await req.User.findById(req.params.id)
// const user = await User.find().where({ name: 'xxhh'})
// const user = await User.find().sort({ _id: -1}) // id是十六进制的值,能比较大小,-1表示倒序
const user = await User.find().skip(1).limit(2) //skip跳过多少条,limit限制查找多少条,可以实现分页
res.send(user)
})
1.什么是CURD
CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。
目的是我们将常用的增、删、改、查操作封装在一套接口组件中,在多个功能中重复调用这一套接口组件,从而使代码更精简,同时提升开发效率。
这里用到了inflection库,安装,然后用inflection.classify把传入的参数转为单数形式,作为模型的名称。
module.exports = options => {
return async (req, res, next) => {
const inflection = require('inflection')
const modelName = inflection.classify(req.params.resource)
req.Model = require(`../models/${modelName}`)
next()
}
}
// RESTful风格接口,在api后加一个rest前缀,与程序员编写代码原则类似,避免以后与其他接口冲突。
// 动态resours资源,用来存放接口路由地址(原users)。这里写成这样之后,上边的接口地址名就以“/”表示。
// 将动态resourse添加到路由方法中之后,这个“:resourse”就代表了之前地址中的users。所以在上边的接口函数中将users去掉,用“/”替换。
// 获取资源
app.get('/', async (req, res) => {
const data = await req.User.find()
res.send(data)
})
app.use('/rest/:resource', resourceMiddleware())