数据库应用----MongoDB基础 (一)

数据库应用——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逻辑存储的最小单元,相当于关系型数据库中的一行记录,多个文档组成集合,集合相当于关系型数据库中的表的概念,多个集合组成数据库

    mark

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的核心概念
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值