数据库应用——MongoDB基础
一、MongoDB概述
1.简介
- MongoDB是一款跨平台、面向文档的数据库。可以实现高性能、高可用性,并且能够轻松扩展。是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB也是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。不采用关系模型主要是为了获得更好的扩展性,MongoDB不再有‘行’(row)的概念,其运行方式主要基于两个概念:集合(collection)与文档(document)。
2.特点
- 包括面向集合存储、模式自由、丰富的查询语句和多级索引、复制集机制、易于水平扩展、可插入存储引擎、跨平台多语言支持等
- 安装简单,提供了面向文档存储功能,操作起来比较容易
- 提供了复制、高可用性和自动分片功能。如果负载增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上,这就是所谓的分片
- 支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
- 支持各种编程语言:Puby、Python、Java、C++、PHP、C#等多种语言
3.适用领域
MongoDB可以为Web应用提供可扩展的高性能存储数据解决方案。MongoDB主要使用领域有网站数据、分布式场景、数据缓存和JSON文档格式存储。合适大数据量、高并发、若事务的互联网应用,其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好地满足Web2.0和移动互联网应用数据存储地要求
二、MongoDB安装
3.1 安装及运行控制
1)安装MongoDB
-
MongoDB提供了Linux平台上的安装包,可以从官方网站 http://www.mongodb.org/downloads下载
[root@localhost ~]# yum install openssl-devel -y //安装支持软件 [root@localhost ~]# mount.cifs //192.168.31.224/qq-Download /mnt Password for root@//192.168.31.224/qq-Download: ****** [root@localhost ~]# cd /mnt [root@localhost mnt]# ls mongodb mongodb-linux-x86_64-3.2.1.tgz mongodb-linux-x86_64-rhel70-4.0.0.tgz [root@localhost mnt]# tar zxvf mongodb-linux-x86_64-rhel70-4.0.0.tgz -C /opt //将准备好的包解压 [root@localhost MongoDB]# cd /opt/ [root@localhost opt]# ls mongodb-linux-x86_64-rhel70-4.0.0 rh [root@localhost opt]# mv mongodb-linux-x86_64-rhel70-4.0.0/ /usr/local/mongodb [root@localhost opt]# mkdir -p /data/mongodb1 [root@localhost ~]# mkdir -p /data/logs/mongodb [root@localhost ~]# touch /data/logs/mongodb/mongodb1.log [root@localhost ~]# chmod -R 777 /data/logs/mongodb/mongodb1.log //创建mongodb的数据存储目录/data/mongodb1,日志存储目录/data/logs/mongodb日志文件并赋予权限
-
当MongoDB处于频繁访问的状态,如果shell启动进程所占用的资源设置过低,将会产生错误导致无法连接MongoDB实例。需设置ulimit -n 和 ulimit -u的值大于20000
[root@localhost ~]# ulimit -u 25000 [root@localhost ~]# ulimit -n 25000
2)MongoDB的运行控制
-
[root@localhost ~]# cd /usr/local/mongodb/bin/ [root@localhost bin]# vim mongodb1.conf //创建mongodb配置文件和启动参数 port=27017 //默认服务器端口号 dbpath=/data/mongodb1 //数据存储目录 logpath=/data/logs/mongodb/mongodb1.log //日志文件 logappend=true //使用追加方式写日志 fork=true //后台运行 maxConns=5000 //最大同时连接数,默认2000 storageEngine=mmapv1 //指定存储引擎为内存映射文件
-
设置内核参数
当某个节点可用内存不足时,系统会从其他节点分配内存[root@localhost bin]# echo 0 > /proc/sys/vm/zone_reclaim_mode [root@localhost bin]# sysctl -w vm.zone_reclaim_mode=0 vm.zone_reclaim_mode = 0 [root@localhost bin]# echo never > /sys/kernel/mm/transparent_hugepage/enabled [root@localhost bin]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
3.2 启动和停止MongoDB
1)启动MongoDB
-
[root@localhost bin]# /usr/local/mongodb/bin/mongod -f\ > /usr/local/mongodb/bin/mongodb1.conf //输入配置文件 2020-01-29T01:19:06.331+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 12881 child process started successfully, parent exiting
-
或者
[root@localhost bin]# /usr/local/mongodb/bin/mongod --config\ > /usr/local/mongodb/bin/mongodb1.conf
[root@localhost bin]# netstat -ntap|grep mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 12881/mongod
2)停止MongoDB
-
[root@localhost bin]# /usr/local/mongodb/bin/mongod --config \ > /usr/local/mongodb/bin/mongodb1.conf --shutdown
-
或者
[root@localhost bin]# ps aux | grep mongodb root 22738 0.0 0.0 112660 972 pts/1 R+ 01:27 0:00 grep --color=auto mongodb [root@localhost bin]# kill -2 22738
3)配置开机自启动
-
[root@localhost bin]# vim /etc/rc.local touch /var/lock/subsys/local rm -rf /data/mongodb1/mongod.lock /use/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf //配置完成后重启系统,mongodb会自动启动
4)连接并访问MongoDB
-
[root@localhost bin]# /usr/local/mongodb/bin/mongo //登录MongoDB > use admin switched to db admin > db.shutdownServer() //这也是一种关闭数据库的方式 server should be down... //忽略部分内容
三: Mongodb数据库操作
-
3.1: 基本操作
> show dbs '查看数据库' admin 0.078GB config 0.078GB local 0.078GB > db.version() '查看版本' 4.0.0 > use school '不存在会创建,不建立集合又会删除' switched to db school > show dbs admin 0.078GB config 0.078GB local 0.078GB > db.createCollection('info') '创建集合,info表示集合' { "ok" : 1 } > show dbs admin 0.078GB config 0.078GB local 0.078GB school 0.078GB > db.info.find() > db.info.insert({"id":1,"name":"lisi","score":90}) WriteResult({ "nInserted" : 1 }) > db.info.find() { "_id" : ObjectId("5f5cf7c2fc5ad544b6670ec4"), "id" : 1, "name" : "lisi", "score" : 90 } > for(var i=1;i<=100;i++)db.info.insert({"id":i,"name":"jack"+i}) '字符串连接中间加+号,会将后面的自动转换成字符串' WriteResult({ "nInserted" : 1 }) > it no cursor > db.info.find() { "_id" : ObjectId("5f5cf7c2fc5ad544b6670ec4"), "id" : 1, "name" : "lisi", "score" : 90 } > db.info.find() { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec5"), "id" : 1, "name" : "jack1" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec6"), "id" : 2, "name" : "jack2" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec7"), "id" : 3, "name" : "jack3" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec8"), "id" : 4, "name" : "jack4" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec9"), "id" : 5, "name" : "jack5" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670eca"), "id" : 6, "name" : "jack6" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ecb"), "id" : 7, "name" : "jack7" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ecc"), "id" : 8, "name" : "jack8" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ecd"), "id" : 9, "name" : "jack9" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ece"), "id" : 10, "name" : "jack10" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ecf"), "id" : 11, "name" : "jack11" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed0"), "id" : 12, "name" : "jack12" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed1"), "id" : 13, "name" : "jack13" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed2"), "id" : 14, "name" : "jack14" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed3"), "id" : 15, "name" : "jack15" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed4"), "id" : 16, "name" : "jack16" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed5"), "id" : 17, "name" : "jack17" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed6"), "id" : 18, "name" : "jack18" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ed7"), "id" : 19, "name" : "jack19" } Type "it" for more > it "定义别名" > a=db.info.findOne ({"id":10}) '查找指定的第十条记录并赋予别名' { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ece"), "id" : 10, "name" : "jack10" } > db.info.update({"id":2},{$set:{"name":"tom"}}) '修改' WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.info.find() { "_id" : ObjectId("5f5cf7c2fc5ad544b6670ec4"), "id" : 1, "name" : "lisi", "score" : 90 } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec5"), "id" : 1, "name" : "jack1" } { "_id" : ObjectId("5f5cf8f0fc5ad544b6670ec6"), "id" : 2, "name" : "tom" } show collections '查看集合' db.info.drop '删除集合' > typeof(a.id) '查看属性类型' number > typeof(a.name) string '删除数据库' show dbs use 数据库名 db.dropDatabase() > use school switched to db school > show tables info > db.info.count() '统计内容多少条记录' 101
-
3.2: 导入导出数据
"导出数据" [root@localhost bin]# ln -s /usr/local/mongodb/bin/* /usr/bin/ [root@localhost mongodb]# mongoexport -d school -c info -o /opt/school.json 2020-09-12T09:37:45.716+0800 connected to: localhost 2020-09-12T09:37:45.716+0800 exported 0 records [root@localhost mongodb]# cd /opt/ [root@localhost opt]# ls rh school.json -d:指定数据库 -c:指定集合 -o:指出 -file:指定从哪个文件导入
"导入数据" [root@localhost mongodb]# mongoimport -d school -c test --file users.json [root@localhost mongodb]# mongo use school show collections info test
3.3: 条件操作
-
查询条件操作符: (=) 等于 - $eq (>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于等于 - $lte [root@localhost opt]# mongoexport -d school -c info -q '{"id":{"$eq":10}}' -o /opt/top10.json '导出第十行'
3.4:备份和恢复
-
"备份" [root@localhost opt]# mkdir /backup [root@localhost opt]# mongodump -d school -o /opt/backup [root@localhost opt]# ls backup info.json rh school.json top10.json [root@localhost opt]# cd backup/ [root@localhost backup]# ls school [root@localhost backup]# cd school/ [root@localhost school]# ls test.bson test.metadata.json "恢复" [root@localhost school]# mongorestore -d abc --dir=/opt/backup/school [root@localhost school]# mongo > show dbs; abc 0.000GB
3.5:复制数据库
-
> use school switched to db school > for(var i=1;i<=100;i++)db.users.insert({"id":1,"name":"jack"+1}) WriteResult({ "nInserted" : 1 }) > show tables; > db.users.find() > db.copyDatabase("school","share") "把school库复制到share库,相当于克隆库" WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation { "note" : "Support for the copydb command has been deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation", "ok" : 1 } > use share switched to db share > show tables info
3.6:克隆集合
-
mongo --port 27018 > db.runCommand({"cloneCollection":"school.users","from":"20.0.0.51:27017"})
3.7: 跨实例克隆集合(表)
-
要先创建多实例 为多实例创建数据目录 创建实例集修改配置文件(省略,上面已经介绍过) 启动实例3和实例4 [root@pc-2 etc]# cd /data/mongodb/ [root@pc-2 mongodb]# touch mongod{3,4}.log [root@pc-2 mongodb]# chmod 777 mongod*.log [root@pc-2 mongodb]# mkdir mongo{3,4} [root@pc-2 mongodb]# mongod -f /etc/mongod3.conf Error reading config file: No such file or directory try 'mongod --help' for more information [root@pc-2 mongodb]# vim /etc/mongod2.conf [root@pc-2 mongodb]# vim /etc/mongod3.conf [root@pc-2 mongodb]# vim /etc/mongod4.conf [root@pc-2 mongodb]# mongod -f /etc/mongod3.conf 2020-09-12T10:45:27.872+0800 I CONTROL [main] Automatically disabling TLS 1.0, toforce-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 8435 child process started successfully, parent exiting [root@pc-2 mongodb]# mongod -f /etc/mongod4.conf 2020-09-12T10:45:33.625+0800 I CONTROL [main] Automatically disabling TLS 1.0, toforce-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 8463 child process started successfully, parent exiting 查看监听端口,可以看到启动了4个mongodb实例 [root@pc-2 mongodb]# netstat -ntap Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:27016 0.0.0.0:* LISTEN 8463/mongod tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 6615/mongod tcp 0 0 0.0.0.0:27018 0.0.0.0:* LISTEN 8344/mongod tcp 0 0 0.0.0.0:27019 0.0.0.0:* LISTEN 843
克隆表需要进入实例,进入数据库,执行克隆的操作
db.runCommand
[root@pc-2 mongodb]# mongo --port 27018 > show dbs admin 0.000GB config 0.000GB local 0.000GB > db.runCommand({"cloneCollection":"school.info","from":"192.168.100.140:27017"}) { "ok" : 1 } "把远程140主机的info集合克隆到本机" > show dbs admin 0.000GB config 0.000GB local 0.000GB school 0.000GB > show tables > use school switched to db school > show tables info > db.info.find() { "_id" : ObjectId("5f5b99c051969152c4d246e7"), "id" : 1, "name" : "zhangsan", "score" : 90, "hobby" : [ "game", "music", "sport" ] } { "_id" : ObjectId("5f5b9c3a51969152c4d246e8"), "id" : 2, "name" : "jack2" } { "_id" : ObjectId("5f5b9c3a51969152c4d246e9"), "id" : 3, "name" : "jack3" } { "_id" : ObjectId("5f5b9c3a51969152c4d246ea"), "id" : 4, "name" : "jack4" }
3.8:创建管理用户
-
> use admin switched to db admin > db.createUser({"user":"root","pwd":"123","roles":["root"]}) Successfully added user: { "user" : "root", "roles" : [ "root" ] } roles表示角色,也就是权限 > db.auth("root","123") db.createUser:创建用户 db.auth:用户验证 user:用户名 pwd:密码 roles:授权用户角色 修改用户密码(修改完密码需要重新运行db.auth验证授权) //删除用户 > use admin switched to db admin > db.dropUser('sha') "删除用户" true
-
Mongodb用户授权认证
一般情况下,mongoDB 数据库都要建立认证连接,这就需要用户对数据库创建管理员和用户认证,而对于mongoDB 而言,在创建管理员和用户时,而分配的roles 是决定用户操作数据库权限的关键,mongodb的用户信息是保存在system.users表中的用户授权认证的步骤
1、新建用户赋予权限
2、验证授权
3、关闭数据库
4、配置文件开启认证
5、用认证用户登录创建2个用户,一个赋予root角色权限,一个赋予dbOwner角色权限,这种方式需要先进入数据库
-
查看用户的两种方式
show users db.system.users.find() > show users { "_id" : "admin.root", "userId" : UUID("2b85240b-9a85-4000-988d-d6f97667835d"), "user" : "root", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" <----所属数据库,不指定默认是在admin中 } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } { "_id" : "admin.sha", "userId" : UUID("217982a5-7599-48c0-9621-10944dc86b43"), "user" : "sha", "db" : "admin", "roles" : [ { "role" : "dbOwner", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }
> db.system.users.find() //查看已有用户 { "_id" : "admin.root", "userId" : UUID("2b85240b-9a85-4000-988d-d6f97667835d"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "/n7wVaiqHazoYR0yC3SgaQ==", "storedKey" : "pZcCRgrhqzPXeDS5WjHfmmFYuF0=", "serverKey" : "esIkysqkOjYKb+tLKKj8PRDPAZ0=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "2+uKNokdaS3G4gh24j3f/7YPWStF2BBzCzv8RQ==", "storedKey" : "o4Fg35Oxeuoxe35Wtmc5oHV0HVIlgpY3GW2FeHaO+FM=", "serverKey" : "GHhiCkLfY63vZx4QfkrNaxFmqsdmLl7KA33/1TV5Dx0=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] } { "_id" : "admin.sha", "userId" : UUID("217982a5-7599-48c0-9621-10944dc86b43"), "user" : "sha", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "6Yr0+CtSlQIsrPfTM+iD/Q==", "storedKey" : "ViNev/px+sdqNT2j7GaWzhQwTp0=", "serverKey" : "mVTuI0RYDi20VED4znjf1v2xyag=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "vce2grLCn+bQf725O+QT/UkXpW3vCRE0z+x1Hg==", "storedKey" : "PjD0MKvPy+APOoBeGWattgJaTBNPJ9C0Tix4vKAkNag=", "serverKey" : "Slfv30MRwniG3vYUxjzcoaY6imHEbTrSWv0KwMVVg3A=" } }, "roles" : [ { "role" : "dbOwner", "db" : "admin" } ] }
以比较友好的方式显示用户信息
db.system.users.find().pretty() > db.system.users.find().pretty() { "_id" : "admin.root", "userId" : UUID("3320dfaa-4f78-4673-9f05-d1f9a0f07efb"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "tdgHTETa+GeSsY/gtPAEow==", "storedKey" : "9QgbWVmFsBuS9YGLKIC+rWBNqxA=", "serverKey" : "bpIcAQTVO7PfCR4p1o/hW/Ut3TY=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "LEyKTK1MqhfcaV/gQP/YRUwpELzWTuDLNzRQTw==", "storedKey" : "hufu8fGJXWickdC6LoxXWNtsd2/Px4GRgzZStYW5L9Q=", "serverKey" : "zXalpLoXy39yKi84amZz8x/XPglIc6cpLLqm914ZEy0=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
Roles里面是权限级别的设置
数据库用户角色(Database User Roles)
read : 授权User只读数据的权限,允许用户读取指定的数据库
readWrite 授权User读/写数据的权限,允许用户读/写指定的数据库数据库管理角色(Database Admininstration Roles)
dbAdmin:在当前的数据库中执行管理操作,如索引的创建、删除、统计、查看等
dbOwner:在当前的数据库中执行任意操作,增、删、改、查等
userAdmin :在当前的数据库中管理User,创建、删除和管理用户。备份和还原角色(Backup and Restoration Roles)
backup
restore跨库角色(All-Database Roles)
readAnyDatabase:授权在所有的数据库上读取数据的权限,只在admin 中可用
readWriteAnyDatabase:授权在所有的数据库上读写数据的权限,只在admin 中可用
userAdminAnyDatabase:授权在所有的数据库上管理User的权限,只在admin中可用
dbAdminAnyDatabase: 授权管理所有数据库的权限,只在admin 中可用集群管理角色(Cluster Administration Roles)
clusterAdmin:授权管理集群的最高权限,只在admin中可用
clusterManager:授权管理和监控集群的权限
clusterMonoitor:授权监控集群的权限,对监控工具具有readonly的权限
hostManager:管理server超级角色(super master Roles)
root :超级账户和权限,只在admin中可用le修改配置文件,开启认证
[root@mongodb ~]# vim /etc/mongod.conf
security: <----这行取消注释
authorization: enabled <----添加这一行开启授权验证用用户名密码登陆(mongodb安装好后第一次进入是不需要密码的,也没有任何用户,通过shell命令可直接进入)
mongo -uroot -p MongoDB shell version v4.0.20 Enter password: connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb Implicit session: session { "id" : UUID("05588de4-6f85-4506-a286-308ad7a6dff8") } MongoDB server version: 4.0.20 Server has startup warnings: ……
3.9: 进程管理
-
> db.currentOp() '只要注意opid' "opid" : 5409, > db.killOp(5409) '并不是删除数据库,而是将当前进程初始化'
3.10: 启动MongoDB多实例
-
在单台服务器资源充分的情况下,可以使用多实例,以便充分使用服务器资源
[root@localhost ~]# cd /usr/local/mongodb/bin/ [root@localhost bin]# cp mongodb1.conf mongodb2.conf [root@localhost bin]# vim mongodb2.conf port=27018 dbpath=/data/mongodb2 logpath=/data/logs/mongodb/mongodb2.log logappend=true fork=true maxConns=5000 storageEngine=mmapv1 [root@localhost bin]# mkdir /data/mongodb2 [root@localhost bin]# touch /data/logs/mongodb/mongodb2.log [root@localhost bin]# chmod -R 777 /data/logs/mongodb/mongodb2.log [root@localhost bin]# ./mongod -f mongodb2.conf 2020-01-29T01:43:12.929+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none' about to fork child process, waiting until server is ready for connections. forked process: 40644 child process started successfully, parent exiting [root@localhost bin]#
四: MongoDB的存储结构
4.1: MongoDB逻辑存储结构
-
MongoDB的逻辑结构主要由文档(document)、集合(collection)和数据库(database)三部分组成。其中文档是MongoDB的核心概念,它是MongoDB逻辑存储的最小单元,相当于关系型数据库中的一行记录,多个文档组成集合,集合相当于关系型数据库中的表的概念,多个集合组成数据库
1)数据库
-
一个MongoDB中可以建立多个数据库。MongoDB的默认数据库为test,该数据库存储在data目录中,要显示它,需要向数据库插入一些数据。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
-
[root@localhost ~]# alias mongo="/usr/local/mongodb/bin/mongo" [root@localhost ~]# mongo MongoDB shell version v4.0.0 > show dbs admin 0.078GB config 0.078GB local 0.078GB > use local; switched to db local
-
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库
- admin:从权限的角度来看,这是root数据库。在这个数据库添加的用户会自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
- local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
2)集合
-
集合就是MongoDB文档组,类似于关系数据库管理系统中的表格
-
集合存在于数据库中,集合没有固定的结构,这意味着在集合中可以插入不同格式的类型的数据,但通常情况下插入集合的数据都会有一定的关联性
> use local; switched to db local > show collections; startup_log > show tables; startup_log
-
当第一个文档插入时,集合就会被创建
-
合法的集合名不能是空字符串"",不能含有\0字符(空字符),这个字符表示集合名的几位,不能以“system.”开头,这是为系统集合保留的前缀
3)文档
-
文档是一个键值(key-value)对,即BSON。MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongoDB非常突出的特点
-
一个简单的文档例子如下:
-
**"site":"www.csdn.com","name":"博客"**
-
需要注意的是
- 文档中的键值对是有序的
- 文档中的值可以是双引号里面的字符串,也可以是其他几种数据类型(甚至可以是整个嵌入的文档)
- MongoDB区分类型和大小写
- MongoDB的文档不能有重复的键
- 文档的键是字符串。除了少数例外情况,键可以使用注意UTF-8字符
-
文档键命名规范
- 键不能含有\0(空字符),这个字符用来表示键的结尾
- “.”和“$”有特别的意义,只有特定环境下才能使用
- 以下划线“_”开头的键是保留的(不是严格要求的)
-
[root@localhost ~]# mongo MongoDB shell version v4.0.0 > use csdn //创建并打开csdn数据库 switched to db csdn > db.user.insert({"id":1,"name":"zhang"}); //向csdn数据库的user集合添加一行数据 WriteResult({ "nInserted" : 1 }) > show collections //显示csdn数据库中的所有集合 user > db.user.insert({"id":2,"name":"wang","admin":true,"gender":null,"favorite":["apple","banana","orange",1,2,3],"time":new Date()}); WriteResult({ "nInserted" : 1 }) > db.users.find() //显示user集合中的所有文档 。。省略内容
4.2: MongoDB物理存储结构
- MongoDB物理存储结构主要包括数据存储和日志存储
1)数据存储
-
MongoDB的数据目录由配置文件中的dbpath指定,这里为/data/mongodb1,用来存储所有MongoDB的数据文件
-
[root@localhost ~]# ls -lh /data/mongodb1 total 321M -rw-------. 1 root root 64M Jan 29 01:19 admin.0 -rw-------. 1 root root 16M Jan 29 01:19 admin.ns -rw-------. 1 root root 64M Jan 29 01:19 config.0 -rw-------. 1 root root 16M Jan 29 01:19 config.ns -rw-------. 1 root root 64M Jan 29 02:32 csdn.0 -rw-------. 1 root root 16M Jan 29 02:32 csdn.ns drwx------. 2 root root 155 Jan 29 02:38 diagnostic.data drwx------. 2 root root 29 Jan 29 02:28 journal -rw-------. 1 root root 64M Jan 29 02:10 local.0 -rw-------. 1 root root 16M Jan 29 02:10 local.ns -rw-------. 1 root root 5 Jan 29 02:10 mongod.lock -rw-------. 1 root root 69 Jan 29 01:19 storage.bson drwx------. 2 root root 6 Jan 29 02:28 _tmp
-
在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,比如local.ns、local.0,随着数据量不断增大,文件数量也会不断增多,每张表应对一个命令空间。每个索引也有对应的命名空间。而这些命名空间的元数据都放在.ns文件中
-
MongoDB内部有预分配空间的机制,预分配的文件都用0进行填充,这样MongoDB始终保持额外的空间和空余的数据文件。数据文件每次新生成的一个文件,大小都会是上一个文件的两倍
-
文件使用MMAP进行内存映射,会将所有数据文件映射到内存中,但是只是虚拟内存,只有访问到这块数据时才会交换到物理内存
2)日志存储
- 日志存储结构
- 系统日志文件的存放由配置文件中的logpath指定,这里为/data/logs/mongodb/
- journal日志文件,用于MongoDB崩溃恢复的保障
- oplpg复制操作日志文件在启动主从复制时出现
- 慢查询日志文件,需要在配置文件中指定profile=1(开启慢查询)与slowms=200(记录毫秒数),查看慢查询的命令为:>db.system.profile.find()
3) MongoDB数据类型
-
常用数据类型
string //字符串。存储数据常用的数据类型。在MongoDB中UTF-8编码的字符串才是合法的 integer //整型数值。用于存储数值,根据用户的服务器,可分为32位或64位 boolean //布尔值。用于存储布尔值(真/假) double //双精度浮点值。用于存储浮点值 arrays //用于将数值或列表或多个值存储为一个键 object //用于内嵌文档 null //用于创建空值 date //日期时间。用户可以指定自己的日期时间,创建date对象,传入年月日信息 binary data //二进制数据。用于存储二进制数据
> a=db.users.findOne({"id":2}); //查看mongodb的数据类型
-
总结
- MongoDB是一款跨平台、面向文档的数据库。可以实现高性能、高可用性,并且能够轻松扩展
- MongoDB提供了复制、高可用性和自动分片功能,支持丰富的查询表达式,查询指令使用JSON形式的标记
- MongoDB的逻辑结构主要由文档、集合和数据库三部分组成。其中文档是MongoDB的核心概念