MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。使用键值对存储数据,数据没有耦合性,容易扩展;存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。MongoDB

一、MongoDB核心概念

文档:mongodb数据库的最小数据集,是由多个键值对有序组合的数据单元,类似于mysql的数据记录; 集合:集合就是 MongoDB 文档组,实质上就是包含多个对象的数组,类似于mysql的表; 数据库:数据库可以包含多个集合;每个数据库都是独立的,有自己的用户,权限,独立存储集合,类似于mysql的库; 实例:系统上运行的mongodb的进程,类似于mysql实例。

二、基本使用

1、安装+引入

安装地址: download 安装教程大家可以另外搜索,这里就不赘述啦~

安装依赖cors(允许跨域请求)、express(后端框架)、mongoose(数据库)、nodemon(当文件变更后会自动重启后端服务)依赖安装完后新建一个index.js文件。

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

2、路由定义

const mongoose = require('mongoose')

// mongoose.connect('mongodb://数据库IP地址:端口号/数据库名称')

mongoose.connect('mongodb://localhost:27017/express-test, {useNewUrlParser: true})

.then(()=>console.log('数据库连接成功'))

.catch(()=>console.log(err,'数据库连接失败'))

3、创建Schema,设计文档结构

Schema 主要用于定义 MongoDB 中集合 Collection 里文档 document 的结构,mongoose 对表结构的定义,每个 Schema 会映射到mongodb中的一个 collection,Schema 不具备操作数据库的能力。 定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种: String(字符串)、Number(数字)、Data(日期)、Buffer(二进制)、Boolean(布尔值)、Mixed(混合类型)、ObjectId(对象ID)、Array(数组)

通过mongoose.Schema来调用Schema,然后使用new方法来创建schema

const schema = new mongoose.Schema({

name: {type: String, required: true // 规定 name 是必须有的字段}

password: {type: String, required: true}

})

4、发布model (模型)

model是由 Schema 生成的模型,可以对数据库的操作。model的每一个实例(instance)就是一个文档。 发布为模型只需调用mongoose的 mongoose.model() 方法即可,mongoose.model() 接收两个参数,第一个参数表示模型的名称,第二个参数是 Schema,返回值为模型构造函数。 注意

一定要把第一个参数设置成和 mongoose.model() 的返回值相同,否则会出错;最后得到的集合名称就为模型名称的小写形式,如果模型名称最后一个字符是字母,则变成复数形式,如果最后一个是数字,则不变,比如:模型名称:User,得到的集合名称为: users,模型名称为:User1, 得到的集合名称为;user1。

// 把Schema 发布为模型

const User = mongoose.model('User', userSchema)

5、增删改查

// 使用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)

})

跳过以上操作,我们就实现了简单的增删改查操作

6、CURD通用接口的实现

1.什么是CURD

CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。

目的是我们将常用的增、删、改、查操作封装在一套接口组件中,在多个功能中重复调用这一套接口组件,从而使代码更精简,同时提升开发效率。

所以这里可以考虑自定义一个中间件首先新建一个文件夹middleware,然后新建resource.js文件(我们可以把每个分类都理解为资源),统一对资源进行增删改查操作,唯一的不同是资源名称。

这里用到了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())

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: