全面打通MongoDB+mongoose

大家好,我是勇宝,又来给大家更新文章了,在开始之前请允许我唠叨两句,在撰写这篇博客的时候,我有想到可能会很长,说到MongoDB大家或多或少的都听说过,主要为我们前端开发者提供的一种非关系型数据库,但是在搭建MongoDB的过程中还是遇到了一些问题,我想的是,我踩过的坑,希望大家不要在重现了,毕竟我们的时间是宝贵的

注意:文章会详细讲解MongoDB搭建过程以及使用node(mongoose)连接MongoDB

一、MongoDB环境搭建

MongoDB是一个基于分布式的文件存储的开源数据库系统,使用C++语言进行编写。大家都知道我们的MySQL,二者有明显的区别,MongoDB非关系型数据库,MongoDB将我们的数据存储为一个文档,它的数据结构呢是由键值对组成的,就像这样:(key=value),类似于我们的JSON对象。

1. MongoDB安装

1. 安装包下载

这里给大家贴上MongoDB下载路径,页面打开后它会自动检测你电脑的版本,及适合下载的 MongoDB 版本号。

2. 安装路径

我是安装到了默认路径,因为我的C盘还有空间,所以我就不想折腾它了。

如果你需要安装到其他盘符,比如说D盘你可以在安装的时候选择Custom👇

选择我们自己想安装的盘符就可以了

3.图形化界面

这里的框框是告诉我们要不要安装图形化管理工具,可以勾选(时间有点长),也可以不勾选。

4. 文件介绍

找到我们的MongoDB安装目录,如果你和我一样也是默认安装的话就在C:\Program Files\MongoDB\Server\7.0 我们打开这个bin文件夹,这个mongod.cfg文件,后面我们配置用户权限的时候会用到它,这里先按下不表。

2. 命令行识别MongoDB

在现在完MongoDB后,我们如果想通过命令行连接MongoDB怎么办呢,就需要我们去配置环境变量啦,之前我是一顿配置,但是我在窗口输入mongo发现不好使👇

通过查询资料找到了原因:在MongoDB6 之前确实是shell集合在安装包的,但是6之后我们需要单独下载,去安装一个叫Mongoshell

  1. Mongoshell传送门

  2. 将我们下载好的文件添加到MongoDB的安装目录下,上面我们有提到呦!

  3. 配置一下我们的环境变量就可以正常使用了(命令是mongosh)

  4. 我们再次尝试在命令行中mongosh看一下打印结果:

  5. 打开我们的浏览器输入http://localhost:27017,可以打印如下证明安装成功啦!

二、MongoDB用户权限设置

用户权限设置说白了就是给我们的MongoDB数据库设置用户名密码,因为我们清楚的发现,在我们首次下载好MongoDB之后,连接我们的MongoDB数据库是不需要任何用户名和密码的,直接就连上了,这样相当的不安全,是想一下如果我们的网站数据库没有用户名和密码,别人直接通过ip端口就能连接我们的数据库,后果不敢想象。

1. 权限开启

这里和大家一起回忆一下,可能大家对mysql接触的比较多,这个mongoDB的账号密码设置和mysql不太一样,mongoDB每个数据库都需要单独设置账号和密码。

1. 查看数据库

js 复制代码
show dbs

我这里是提示没有权限,大家不会出现这个情况,因为首次进入是不需要用户名和密码的。

2. 切换数据库

现在切换到我们的admin数据库,这个里边的用户可以设置很高的权限,大概下边这个样子。

js 复制代码
use admin

3. 创建超级用户

这个是必须要创建的。

js 复制代码
db.createUser({ user: "admin", pwd: "password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
  • user:这个是我们的用户名,可以自定义

  • pwd:这个就是我们的账号密码(大家一定要记住,写个本上也行,要不后面修改配置文件感觉太无聊,哈哈)

  • role:这个就是我们用户所拥有的权限

  • db:这个就是我们要当前用户作用的数据库,admin是用于权限控制的数据库,如果没有需要新建一个。

    再给大家讲解一下role

    json 复制代码
    // 1. 内置角色:
    1. 数据库用户角色:read、readWrite;  
    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;  
    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;  
    4. 备份恢复角色:backup、restore;  
    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase  
    6. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 
    7. 内部角色:__system 
    // 2. 具体角色的功能:
    Read:允许用户读取指定数据库  
    readWrite:允许用户读写指定数据库  
    dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile  
    userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户  
    clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。  
    readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限  
    readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限  
    userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限  
    dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。  
    root:只在admin数据库中可用。超级账号,超级权限

4. 设置项目数据库

假如我们自己的数据库名叫test_DB,我们就需要再单独给它设置账号和密码。同样是切换到test_DB

js 复制代码
use test_DB
db.createUser({user: "test",pwd: "123456",roles: [ { role: "readWrite", db: "test_DB" } ]})

5. 开启权限认证

这一步设置好,大家再使用show dbs就和我刚开始的效果一样了,下边我们来配置一下下:

  1. 打开MongoDB安装目录C:\Program Files\MongoDB\Server\7.0\bin(我这里是默认安装目录,大家根据自己的实际情况来)

  2. 打开mongodb.cfg文件,添加如下内容。

    js 复制代码
    security:
       authorization: enabled

6. 重启MongoDB

此电脑(右键) -> 管理 -> 服务和应用程序 -> 服务,找到MongoDB Database Server (MongoDB),右键重启启动

7. MongoDB其他命令

  1. 我们可以在admin中创建一个root角色的用户,root角色用于关闭数据库

    js 复制代码
    db.createUser({user: "root",pwd: "password", roles: [ { role: "root", db: "admin" } ]})
    // 关闭数据库
    db.shutdownServer()
  2. 查看当前数据库用户信息

    js 复制代码
    show users
  3. 删除用户

    js 复制代码
    db.dropUser('用户名')

三、MongoDB连接

接下来教给大家怎么去连接MongoDB,这里我使用大家十分熟悉的node给大家伙连一个。另外我会使用到mongoose还有koa,当然了express也是可以的,这都无关紧要,后面再给大家讲解一下mongoose语法

1. 项目模板初始化

找了半天发现了一个koa的脚手架,省的我再搭了。哈哈!!!

1. 全局安装koa脚手架

js 复制代码
npm install koa-generator -g

2. 创建项目

js 复制代码
koa2 koa-demo // koa-demo是我们的项目名称

3. 安装依赖

js 复制代码
cd koa-demo 
npm install

4. 运行代码

js 复制代码
npm run start

本地访问http://localhost:3000,如果出现下边的效果,就证明我们部署成功了。

2. 连接数据库

目录我这里就不给大家讲解了,里边有一些路由,中间件之类的。

1. mongoose安装

js 复制代码
npm i mongoose

2. 根目录创建db/index.js文件

js 复制代码
// index.js
const mongoose = require('mongoose');
const db = mongoose.connection;

mongoose.connect('mongodb://用户名:密码@localhost:端口/数据库名')

// 连接成功
db.on("connected", function () {
  console.log("数据库连接成功");
})
// 连接失败
db.on("error", function (err) {
  console.log("数据库连接失败 原因:" + err);
})
// 连接断开
db.on('disconnectied', function () {
  console.log('连接断开');
})

大家根据自己的实际情况来连接就可以了,上边是我们设置好账号密码用的连接方式。如果不需要账号密码就是这样mongodb://localhost:27017,最后引入到我们的app.js就可以了,这里我给注释了(不好意思,嘿嘿)

四、mongoose使用

这一小节我来给大家梳理一下mongoose,就平常我能用到了,如果想深入研究,还请大家移步官网(至于官网是什么我也不清楚,欢迎大佬评论区告知。)

1. mongoose介绍

Mongoose是一个让我们可以通过Node来操作MongoDB数据库的一个模块,它相比于这个MongoDB驱动更容易,相信大家也喜欢舒舒服服的敲代码不是吗?它主要有四部分:

  • Schema(模式对象):Schema对象定义约束了数据库中的文档结构
  • Model: Model对象作为集合中的所有文档的表示,相当于MongoDB中的collection,它的每一个实例就是一个document文档
  • Document:Document表示集合中的具体文档,相当于collection中的一个具体文档
  • 关系:Schema生成ModelModel创造Document

2. 创建Schema并使用

js 复制代码
// 1. 引入mongoose模块
const mongoose = require('mongoose')
// 2. 概要计划,计划往数据库中准备存放哪些信息
const Scheme = mongoose.Schema
// 3. 约束我们数据库的集合
var obj = {
    name: String,
    age: Number,
    gender:{
        type: String,
        default:'male' //定义默认类型
    },
    addr: String
}
// 4. 参数Article表示数据库中集合名称,不存在会创建。
var articleModel = mongoose.model('Article', new Schema(obj));

// 5. 调用查找功能,演示一下
articleModel.find({});

注意:如果我们写的是Article,那么我们集合的名称应该叫articles,这里只是给大家举一个例子,当然写法不一。

3. mongoose语法

以下例子Model表示的是一个mongoose.model实例

1. 文档新增

js 复制代码
const model = new Model({
    key: value
})
user.save()
    .then(() => console.log('数据保存成功'))

2. 查询数据

js 复制代码
Model.find({ key: value })
    .then(users => console.log('查询到的用户:', users))
    .catch(err => console.error('查询失败', err));

3. 更新数据

js 复制代码
Model.findByIdAndUpdate(modelId, { key: value })
    .then(() => console.log('数据更新成功'))

4. 删除数据

js 复制代码
Model.findByIdAndRemove(modelId)
    .then(() => console.log('数据删除成功'))
    .catch(err => console.error('数据删除失败', err));

5. 关联查询

高级的关联查询需要使用到aggregate方法。

js 复制代码
// 多集合关联查询
articleModel.aggregate([
    {
        $lookup:{
            from:'msgs',  // 关联的集合
            localField:'_id',  // 本地关联的字段
            foreignField:'article',  // 对方集合关联的字段
            as:'mms',  // 结果字段名,
        },
    }
],(err,doc)=>{
    console.log(doc)
})

总结

就给大家总结到这吧,写这篇文章还是希望大家不要把宝贵的时间浪费在一些配置环境的事情上,文章本身并没有什么技术含量,并不是说技术,大家不要看错了,mongoDB也只是我想要去体验全栈开发的一个过程。

作为前端,我们要尝试去接受去了解后端包括数据库方面的知识,只有这样我们才能够在工作中知道哪些甩锅不是我们应该的。好了,不和大家扯那么多啦,祝大家工作顺顺利利!!!

相关推荐
qiyi.sky3 分钟前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~6 分钟前
分析JS Crash(进程崩溃)
java·前端·javascript
静听山水10 分钟前
mysql语句执行过程
数据库·mysql
安冬的码畜日常15 分钟前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
虽千万人 吾往矣28 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
l1x1n043 分钟前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
mariokkm1 小时前
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
数据库·django·sqlite
昨天;明天。今天。1 小时前
案例-任务清单
前端·javascript·css
Wang's Blog2 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO2 小时前
MySQL事务
数据库·mysql