MongoDB是个文档型数据库,虽然前有CouchDB夹击,后有MySQL 8.x文档支持的追赶,但是丝毫不影响它在市场中占据的份额。
前言
最近有个开发妹子跟我说MongoDB的操作好复杂,先是跟以往关系型数据库的操作不一样,后是在Windows上操作实在是各种烦心和不容易。于是,花了点时间写了个爱心版的教程。
总体而言,MongoDB的操作并不算多么复杂,只是没有理解它的作用还有就是用错了平台。像MongoDB这样的数据库还是使用Linux比较妥当,直接几个命令就解决了。还有,开发最好还是用Mac,比较省心。
闲话不说,还是从头开始说起,一步步起来,大概20分钟就上路了。
环境搭建
既然要使用MongoDB自然离不开环境的搭建,对于Linux的源可以选择:
- 官方,
http://repo.mongodb.org/
- 阿里云,
http://mirrors.aliyun.com/mongodb/
而要下载的是二进制的版本,对于Windows其对应的地址为 https://www.mongodb.org/dl/win32/
,而Linux为 https://www.mongodb.org/dl/linux/x86_64
。进去下载你需要的版本就好。
这里选择下载的是Windows的3.x版本。下载完成后,解压到你喜欢的1个地方,接着为了方便操作,打算文本编辑器,写2个启动脚本。省的每次都手动输入一大段参数。
Windows启动脚本
创建1个 start.bat
的批处理脚本,其内容如下:
@echo off SET PATH=%PATH%;D:Program FilesMongoDBServer.6in mongod -f db.conf
其中PATH这部分后面,将它替换为你实际解压的目录中。其中,在命令mongod中使用选项 -f指定对应的配置文件,省的每次都要手动在命令行中指定参数。而MongoDB是支持YAML格式的配置的,而这里还是以INI的格式来配置参数。
而配置文件中内容如下:
dbpath=D:/mongodb-database logappend=true port=27017 bind_ip=127.0.0.1
其中dbpath指定了MongoDB中数据库的路径。默认情况下是当前解压目录盘符下data目录,如果对应目录不存在或不为空,直接就是闪退,无法启动数据库程序了。
之后的logappend用于日志的追加输出,至于port和bind_ip自然是监听的端口和地址了。
Windows停止脚本
既然编写了1个启动脚本,无妨也写1个bat脚本用于停止数据库服务器,其内容如下:
@echo off SET PATH=%PATH%;D:Program FilesMongoDBServer.6in mongo mongod_stop.js
唯一的区别是最后1行,使用的是mongo程序,后面紧着着1个js文件。而在对应 mongod_stop.js
中内容如下:
db = connect("localhost:27017/admin"); db.shutdownServer(); quit();
而这段代码的意义就是连接到对应的admin数据库中,调用其shutdownServer方法关闭服务器,最后退出程序。当然,这里并没有设置对应的认证信息。而在本地环境上,即使使用createUser设置了认证方式,也是不起效的。详情可以查看 https://docs.mongodb.com/manual/reference/method/db.createUser/#local-database
。
对于远程服务器,则必须添加权限认证,否则任何人都可以访问你的数据库服务器了。而对应的方式如下所示。
权限认证
要进入需要认证的数据库中,需要调用 db.createUser
创建用户,例如:
db.createUser({user:"test",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
这里创建了1个test的用户,密码为123456。该用户属于的角色为readWrite组,分配的数据库为test。
之后可以通过如下的语句进行权限认证:
db.auth({user:"test",pwd:"123456"})
更多内容可以访问 https://docs.mongodb.com/manual/reference/method/db.createUser/
。
MongoDB概念
MongoDB数据库中概念,实际上中没有多少东西。排开什么分片、地理索引等附加内容外,唯一的东西应该就是文档了。然而,它这里的文档与我们常见的文本格式还是有区别的。
在MongoDB中的文档格式就是类似1个JSON的格式,比如:
{ "name": "张三", "age": 20, "sex": "男" }
而对应的关系型数据库中表的概念是根本不存在的,但是我们可以将上述这样1个文档看成是关系型数据库中的1张表。而其中的name、age以及sex字段看成是关系型数据库的列字段。当然二者并不是等价的。
而为了能存储上述的内容,我们需要创建1个文档,比如将它命名为1个 user.json
的文件。然而在MongoDB中这样1个文件可以将其看成是关系型数据库中的数据库名称。
简单的说,就是类似下表所示的关系:
关系型数据库 | MongoDB |
数据库 | 文档名称 |
表 | 文档内容 |
列 | 文档字段 |
至于索引什么的,基本上一般数据库都会提供,这属于数据压缩及信息论范畴中的内容了,就不展开说明了。
MongoDB操作
实际上,MongoDB中的指令操作与MySQL很类似,比如查看数据库的操作为:
show databases;
而查看有哪些数据表,使用的是 show collections
而不是 show tables
。但是MongoDB中提供了1个 show tbs
。
需要注意的是,在MongoDB中采用了1种延缓加载机制,只有存在数据才生成文档。换句话说,只有往某个文档中插入了数据才会生成对应的集合(关系型数据库中的表),否则你查看数据表中是获取不到对应期望的结果的。
而对于查询操作,可以使用如下的语法:
db.表名.find() #方法一 db.表名.find({"字段":"值"}) #方法二
对于方法一,等同于 select*from表名
,而对于后者等同于 select*from表名where字段=值
。
另1个很有用的技巧就是,默认输出的文档是没有格式处理的,为了方便查看效果,常常需要使用格式化输出,此时可以在选择后追加1个pretty方法,即:
db.表名.find().pretty()
如果实在不知道该调用什么方法,可以使用help方法来查看,即:
db.表名.help() db.help()
之后MongoDB会将内置js中的内容输出。
最后是CRUD对应的方法:
- insert,插入
- remove,删除
- update,更新
- find,查询
这样,基本上MongoDB就算入门了。更多的内容,还是等到需要的时候再慢慢摸索吧。
参考:
https://www.cnblogs.com/gy-ph/p/7725172.html
本文作者:风中纸鹞,1个多年滚打于Web开发的研发工程师。熟悉PHP、Java、C++等编程语言,以编程作为乐趣。
声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。