MongoDB在NodeJs中的基本使用

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())
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值