大家好,我是
勇宝
,又来给大家更新文章了,在开始之前请允许我唠叨两句,在撰写这篇博客的时候,我有想到可能会很长,说到MongoDB
大家或多或少的都听说过,主要为我们前端开发者提供的一种非关系型数据库
,但是在搭建MongoDB
的过程中还是遇到了一些问题,我想的是,我踩过的坑,希望大家不要在重现了,毕竟我们的时间是宝贵的
。注意:文章会详细讲解
MongoDB
的搭建
过程以及使用node(mongoose)
连接MongoDB
。
MongoDB
是一个基于分布式的文件存储的开源数据库系统,使用C++
语言进行编写。大家都知道我们的MySQL
,二者有明显的区别,MongoDB
是非关系型数据库
,MongoDB
将我们的数据存储为一个文档,它的数据结构呢是由键值对组成的,就像这样:(key=value),类似于我们的JSON
对象。
这里给大家贴上MongoDB下载路径,页面打开后它会自动检测你电脑的版本,及适合下载的 MongoDB 版本号。
我是安装到了默认路径,因为我的C盘
还有空间,所以我就不想折腾它了。
如果你需要安装到其他盘符,比如说D盘你可以在安装的时候选择Custom
选择我们自己想安装的盘符就可以了
这里的框框是告诉我们要不要安装图形化管理工具,可以勾选(时间有点长
),也可以不勾选。
找到我们的MongoDB安装目录,如果你和我一样也是默认安装的话就在C:\Program Files\MongoDB\Server\7.0
我们打开这个bin
文件夹,这个mongod.cfg
文件,后面我们配置用户权限的时候会用到它,这里先按下不表。
在现在完MongoDB
后,我们如果想通过命令行连接MongoDB
怎么办呢,就需要我们去配置环境变量
啦,之前我是一顿配置,但是我在窗口输入mongo
发现不好使
通过查询资料找到了原因:在MongoDB6之前确实是shell
集合在安装包的,但是6之后我们需要单独下载,去安装一个叫Mongoshell。
Mongoshell
传送门
将我们下载好的文件添加到MongoDB
的安装目录下,上面我们有提到呦!
配置一下我们的环境变量就可以正常使用了(命令是mongosh)
我们再次尝试在命令行中mongosh
看一下打印结果:
打开我们的浏览器输入http://localhost:27017
,可以打印如下证明安装成功啦!
用户权限
设置说白了就是给我们的MongoDB
数据库设置用户名
和密码
,因为我们清楚的发现,在我们首次下载好MongoDB
之后,连接我们的MongoDB
数据库是不需要
任何用户名和密码的,直接就连上了,这样相当的不安全,是想一下如果我们的网站数据库没有用户名和密码,别人直接通过ip端口就能连接我们的数据库,后果不敢想象。
这里和大家一起回忆一下,可能大家对mysql
接触的比较多,这个mongoDB
的账号密码设置和mysql
不太一样,mongoDB
是每个数据库
都需要单独设置账号和密码。
show dbs
我这里是提示没有权限
,大家不会出现这个情况,因为首次进入
是不需要用户名和密码的。
现在切换到我们的admin
数据库,这个里边的用户可以设置很高的权限,大概下边这个样子。
use admin
这个是必须要创建的。
db.createUser({ user: "admin", pwd: "password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
user:这个是我们的用户名,可以自定义
pwd:这个就是我们的账号密码(大家一定要记住,写个本上也行,要不后面修改配置文件感觉太无聊,哈哈)
role:这个就是我们用户所拥有的权限
db:这个就是我们要当前用户作用的数据库,admin是用于权限控制的数据库,如果没有需要新建一个。
再给大家讲解一下role
:
// 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数据库中可用。超级账号,超级权限
假如我们自己的数据库名叫test_DB
,我们就需要再单独给它设置账号和密码。同样是切换到test_DB
use test_DB
db.createUser({user: "test",pwd: "123456",roles: [ { role: "readWrite", db: "test_DB" } ]})
这一步设置好,大家再使用show dbs
就和我刚开始的效果一样了,下边我们来配置一下下:
打开MongoDB
安装目录C:\Program Files\MongoDB\Server\7.0\bin
(我这里是默认安装目录,大家根据自己的实际情况来)
打开mongodb.cfg
文件,添加如下内容。
security:
authorization: enabled
此电脑(右键)
-> 管理
-> 服务和应用程序
-> 服务
,找到MongoDB Database Server (MongoDB)
,右键重启启动
。
admin
中创建一个root
角色的用户,root
角色用于关闭数据库
。db.createUser({user: "root",pwd: "password", roles: [ { role: "root", db: "admin" } ]})
// 关闭数据库
db.shutdownServer()
show users
db.dropUser('用户名')
接下来教给大家怎么去
连接MongoDB
,这里我使用大家十分熟悉的node
给大家伙连一个。另外我会使用到mongoose
还有koa
,当然了express
也是可以的,这都无关紧要,后面再给大家讲解一下mongoose语法
。
找了半天发现了一个koa
的脚手架,省的我再搭了。哈哈!!!
npm install koa-generator -g
koa2 koa-demo // koa-demo是我们的项目名称
cd koa-demo
npm install
npm run start
本地访问http://localhost:3000
,如果出现下边的效果,就证明我们部署成功了。
目录我这里就不给大家讲解了,里边有一些路由,中间件之类的。
npm i mongoose
db/index.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
是一个让我们可以通过Node
来操作MongoDB
数据库的一个模块,它相比于这个MongoDB驱动更容易,相信大家也喜欢舒舒服服的敲代码不是吗?它主要有四部分:
Schema
对象定义约束了数据库中的文档结构Model
对象作为集合中的所有文档的表示,相当于MongoDB
中的collection
,它的每一个实例就是一个document
文档Document
表示集合中的具体文档,相当于collection
中的一个具体文档Schema
生成Model
,Model
创造Document
// 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
,这里只是给大家举一个例子,当然写法不一。
以下例子Model
表示的是一个mongoose.model
实例
const model = new Model({
key: value
})
user.save()
.then(() => console.log('数据保存成功'))
Model.find({ key: value })
.then(users => console.log('查询到的用户:', users))
.catch(err => console.error('查询失败', err));
Model.findByIdAndUpdate(modelId, { key: value })
.then(() => console.log('数据更新成功'))
Model.findByIdAndRemove(modelId)
.then(() => console.log('数据删除成功'))
.catch(err => console.error('数据删除失败', err));
高级的关联查询需要使用到aggregate
方法。
// 多集合关联查询
articleModel.aggregate([
{
$lookup:{
from:'msgs', // 关联的集合
localField:'_id', // 本地关联的字段
foreignField:'article', // 对方集合关联的字段
as:'mms', // 结果字段名,
},
}
],(err,doc)=>{
console.log(doc)
})
就给大家总结到这吧,写这篇文章还是希望大家不要把宝贵的时间浪费在一些
配置环境
的事情上,文章本身并没有什么技术含量
,并不是说技术,大家不要看错了,mongoDB
也只是我想要去体验全栈开发
的一个过程。作为前端,我们要尝试去接受去了解
后端
包括数据库方面的知识,只有这样我们才能够在工作中知道哪些甩锅
不是我们应该背
的。好了,不和大家扯那么多啦,祝大家工作顺顺利利!!!