由于3.X的文档是在3.X当前最新版本前记录,所以这里列出一些常用的操作,比如建立库,删除库,等一些格式,然后在描述开启远程和创建用户的一些区别,以及讲解2.X和3.X配置文件区别。
MongoDB2.6开始推荐一种基于YAML格式的配置文件,并且仍然兼容之前的配置文件。
Mongo2.X版本配置文件是比较传统的配置文件,且一般现在如果用到mongo2.X版本,大多在centos6上,一般使用yum安装,这里贴出每个配置的详细含义,具体就不错做讲解。
#verbose:日志信息冗余。默认false。提高内部报告标准输出或记录到logpath配置的日志文件中。要启用verbose或启用verbosity 用vvvv参数
verbose = true
#启动verbose冗长信息,它的级别有 vv~vvvvv,v越多级别越高,在日志文件中记录的信息越详细。
vvvv = true
#port:端口。默认27017,MongoDB的默认服务TCP端口,监听客户端连接。要是端口设置小于1024,比如1021,则需要root权限启动,不能用mongodb帐号启动
port = 27017
#bind_ip:绑定地址。默认127.0.0.1,只能通过本地连接。进程绑定和监听来自这个地址上的应用连接。要是需要给其他服务器连接,则需要注释掉这个或则把IP改成本机地址,可以用一个逗号分隔的列表绑定多个IP地址。
bind_ip = 0.0.0.0
#maxConns:最大连接数。默认值:取决于系统(即的ulimit和文件描述符)限制。MongoDB中不会限制其自身的连接。当设置大于系统的限制,则无效,以系统限制为准。这对于客户端创建很多“表”,允许连接超时而不关闭“表”的时候很有用。设置该值的高于连接池和总连接数的大小,以防止尖峰时候的连接。注意:不能设置该值大于20000。
maxConns = 1000
#objcheck:强制验证客户端请求。2.4的默认设置为objcheck成为true,在早期版本objcheck默认为false。因为它强制验证客户端请求,确保客户端绝不插入无效文件到数据库中。对于嵌套文档的对象,会有一点性能影响。设置noobjcheck 关闭。
objcheck = true
#noobjcheck = false
#logpath:指定日志文件,该文件将保存所有的日志记录、诊断信息。除非另有指定,mongod将所有的日志信息输出到标准输出。如果没有指定logappend,重启则日志会进行覆盖操作。
logpath= /usr/local/mongodb/logs/mongodb.log
#logappend:写日志的模式:设置为true为追加。默认是覆盖。如果未指定此设置,启动时MongoDB的将覆盖现有的日志文件。
logappend=true
#syslog:日志输出都发送到主机的syslog系统,而不是标准输出到logpath指定日志文件。syslog和logpath不能一起用,会报错:
syslog = false
#pidfilepath:进程ID,没有指定则启动时候就没有PID文件。默认缺省。
pidfilepath = /usr/local/mongodb/data/mongo.pid
#keyFile:指定存储身份验证信息的密钥文件的路径。默认缺省。
keyFile = /usr/local/mongodb/keyfile
#nounixsocket:套接字文件,默认为false,有生成socket文件。当设置为true时,不会生成socket文件。
nounixsocket = false
#unixSocketPrefix:套接字文件路径,默认/tmp
unixSocketPrefix = //usr/local/mongodb/tmp
#fork:是否后台运行,设置为true 启动 进程在后台运行的守护进程模式。默认false。
fork = true
#auth:用户认证,默认false。不需要认证。当设置为true时候,进入数据库需要auth验证,当数据库里没有用户,则不需要验证也可以操作。直到创建了第一个用户,之后操作都需要验证。比如:通过db.addUser('sa','sa')在admin库下面创建一个超级用户,只能在在admin库下面先认证完毕了:ab.auth('sa','sa'),才能去别的库操作,不能在其他库验证。这样连接数据库也需要指定库:
#mongo -usa -psa admin #sa 帐号连接admin
#mongo -uaa -paa test #aa 帐号连接test
auth = true
#noauth:禁止用户认证,默认true
noauth = true
#cpu:设置为true会强制mongodb每4s报告cpu利用率和io等待,把日志信息写到标准输出或日志文件。默认为false。
cpu = false
#dbpath:数据存放目录。默认:/data/db/
dbpath= /usr/local/mongodb/data/
#diaglog:创建一个非常详细的故障排除和各种错误的诊断日志记录。默认0。设置为1,为在dbpath目录里生成一个diaglog.开头的日志文件,设置不等于0,日志会每分钟flush一次。产生的日志可以用mongosniff来查看,当重新设置成0,会停止写入文件,但mongod还是继续保持打开该文件,即使它不再写入数据文件。如果你想重命名,移动或删除诊断日志,你必须完全关闭mongod实例。
0 off. No logging. #关闭。没有记录。
#1 Log write operations. #写操作
#2 Log read operations. #读操作
#3 Log both read and write operations. #读写操作
#7 Log write and some read operations. #写和一些读操作
#directoryperdb:设置为true,修改数据目录存储模式,每个数据库的文件存储在DBPATH指定目录的不同的文件夹中。使用此选项,可以配置的MongoDB将数据存储在不同的磁盘设备上,以提高写入吞吐量或磁盘容量。默认为false。要是在运行一段时间的数据库中,开启该参数,会导致原始的数据都会消失(注释参数则会回来)。因为数据目录都不同了,除非迁移现有的数据文件到directoryperdb产生的数据库目录中,所以需要在规划好之后确定是否要开启。
directoryperdb = false
#journal:日志,(redo log,更多的介绍请看这里和这里)。默认值:(在64位系统)true。默认值:(32位系统)false。
#设置为true,启用操作日志,以确保写入持久性和数据的一致性,会在dbpath目录下创建journal目录。
#设置为false,以防止日志持久性的情况下,并不需要开销。为了减少磁盘上使用的日志的影响,您可以启用nojournal,并设置为true。
#注意:在64位系统上禁用日志必须使用带有nojournal的。
journal = false
#nojournal:禁止日志,默认值:(在64位系统)false。默认值:(32位系统)true。
#设置nojournal为true关闭日志,64位,2.0版本后的mongodb默认是启用 journal日志。
nojournal = true
#journalCommitInterval:刷写提交机制,默认是30ms或则100ms。较低的值,会更消耗磁盘的性能。此选项接受2和300毫秒之间的值:
#如果单块设备提供日志和数据文件,默认的日记提交时间间隔为100毫秒。
#如果不同的块设备提供的日志和数据文件,默认的日记提交的时间间隔为30毫秒。
journalCommitInterval = 100
#ipv6:是否支持ipv6,默认false。
ipv6 = true
#jsonp:是否允许JSONP访问通过一个HTTP接口,默认false。
jsonp = true
#nohttpinterface:是否禁止http接口,即28017 端口开启的服务。默认false,支持。
nohttpinterface = false
#noprealloc:预分配方式。默认false:使用预分配方式来保证写入性能的稳定,预分配在后台进行,并且每个预分配的文件都用0进行填充。这会让MongoDB始终保持额外的空间和空余的数据文件,从而避免了数据增长过快而带来的分配磁盘空间引起的阻塞。设置noprealloc= true来禁用预分配的数据文件,会缩短启动时间,但在正常操作过程中,可能会导致性能显著下降。
noprealloc = false
#noscripting:是否禁止脚本引擎。默认是false:不禁止。ture:禁止,要是设置成true:运行一些脚本的时候会出现:"server-side JavaScript execution is disabled"
noscripting = true
#notablescan:是否禁止表扫描操作。默认false:不禁止,ture:禁止,禁止要是执行表扫描会出现:"table scans not allowed"
notablescan = true
#nssize:命名空间的文件(即NS)的默认大小,默认16M,最大2G。所有新创建的默认大小命名空间的文件(即NS)。此选项不会影响现有的命名空间的文件的大小。默认值是16M字节,最大大小为2 GB。让小数据库不让浪费太多的磁盘空间,同时让大数据在磁盘上有连续的空间。
nssize = 16
#profile:数据库分析等级设置。记录一些操作性能到标准输出或则指定的logpath的日志文件中,默认0:关闭。
#0 关。无分析。
#1 开。仅包括慢操作。
#2 开。包括所有操作。
#控制 Profiling 的开关和级别:2种,第一种是直接在启动参数里直接进行设置或则启动MongoDB时加上–profile=级别,其信息保存在 生成的system.profile 中。第二种是在客户端用db.setProfilingLevel(级别)命令来实时配置,其信息保存在 生成的system.profile 中。默认情况下,mongod的禁用分析。数据库分析可以影响数据库的性能,因为分析器必须记录和处理所有的数据库操作。所以在需要的时候用动态修改就可以了。
profile = 0
#slowms:记录profile分析的慢查询的时间,默认是100毫秒。具体同上。
slowms = 200
#quota:配额,默认false。是否开启配置每个数据库的最多文件数的限制。当为true则用quotaFiles来配置最多文件的数量。
quota = true
#quotaFiles:配额数量。每个数据库的数据文件数量的限制。此选项需要quota为true。默认为8。
quotaFiles = 8
#rest: 默认false,设置为true,使一个简单的 REST API。设置为true,开启后,在MongoDB默认会开启一个HTTP协议的端口提供REST的服务(nohttpinterface=false),这个端口是你Server端口加上1000,即28017,默认的HTTP端口是数据库状态页面,(开启后,web页面的Commands行中的命令都可以点进去)。mongodb自带的REST,不支持增、删、改,同时也不支持 权限认证。
rest = true
#repair:修复数据库操作,默认是false。设置为true时,启动后修复所有数据库,设置这个选项最好在命令行上,而不是在配置文件或控制脚本。启动时修复,需要关闭journal.并且启动时,用控制文件指定参数和配置文件里指定参数的方式进行修复之后,(修复信息见log),需要再禁用repair参数才能启用mongodb。注意:mongod修复时,需要重写所有的数据库文件。如果在同一个帐号下不能运行修复,则需要运行chown修改数据库文件的权限。
repair = true
#repairpath:修复路径,默认是在dbpath路径下的_tmp 目录。
repairpath = _tmp
#smallfiles:是否使用较小的默认文件。默认为false,不使用。设置为true,使用较小的默认数据文件大小。smallfiles减少数据文件的初始大小,并限制他们到512M,也减少了日志文件的大小,并限制他们到128M。如果数据库很大,各持有少量的数据,会导致mongodb创建很多文件,会影响性能。
smallfiles = true
#syncdelay:刷写数据到日志的频率,通过fsync操作数据。默认60秒。默认就可以,不需要设置。不会对日志文件(journal files)有影响。警告:如果设置为0,SYNCDELAY 不会同步到磁盘的内存映射文件。在生产系统上,不要设置这个值。
syncdelay = 60
#sysinfo:系统信息,默认false。设置为true,mongod会诊断系统有关的页面大小,数量的物理页面,可用物理??页面的数量输出到标准输出。当开启sysinfo参数的时候,只会打印上面的信息,不会启动mongodb的程序。所以要关闭该参数,才能开启mongodb。
sysinfo = false
#upgrade:升级。默认为false。当设置为true,指定DBPATH,升级磁盘上的数据格式的文件到最新版本。会影响数据库操作,更新元数据。大部分情况下,不需要设置该值。
upgrade = false
#traceExceptions:是否使用内部诊断。默认false。
traceExceptions = false
#quiet:安静模式。
quiet = true
#setParameter:2.4的新参数,指定启动选项配置。想设置多个选项则用一个setParameter选项指定.格式:setParameter =
setParameter = syncdelay= 55,notablescan = true,journalCommitInterval = 50,traceExceptions = true
Mongo2配置文件
Mongodb 3.x配置说明,本文内容忽略了Enterprise版和一些不常用的配置。
在Mongod安装包中,包含2个进程启动文件:mongod和mongos;其中mongd是核心基础进程,用来接收读写请求、负责存储实际数据,mongod实例是构成集群的基本单位,比如Replication set、Sharding Cluster、Config Servers等;mongos是Sharding Cluster架构模式中的“路由”进程,即客户端请求访问mongos,然后有mongos将请求转发给合适的sharding server执行操作,并将result返回给客户端,所以mongos基本不存储数据,只是在内存中缓存部分shard key与sharding server的对应关系,便于路由。
在配置文件方面,mongod和mongos有很多相同之处,下文中如有区别之处将会特别指出。
在一个节点上,通常同时启动mongod和mongos进程是正常的,他们之间不存在资源竞争,但是为了避免冲突,我们希望它们使用各自的配置文件,比如mongod.conf、mongos.conf;mongodb的某些平台下的安装包中没有自带配置文件,需要开发者自己创建。
(比如centos版本没有任何配置文件)
在centos版本中使用的Mongo没有任何配置以及目录,都需要手动创建,这里把yum安装的配置拷贝过来做了点更改,只需要一些默认参数,Mongodb就可以启动。
1、processManagement:
fork: <true | false>
描述:是否以fork模式运行mongod/mongos进程,默认为false。
pidFilePath:<路径>
描述:配合"fork:true"参数,将mongod/mongos进程ID写入指定的文件,如果不指定,将不会创建PID文件。
2、net:
bindIp: <127.0.0.1>
描述:mongod/monogs进程绑定的IP,application通过此IP、port建立链接。可以绑定在任意网卡接口上,如果你的mongos/mongod只需要内网访问,可以绑定在内网IP(例如:192.168.1.100),如果需要外网访问,那么则绑定外网IP,如果此值为“0.0.0.0”,则绑定到所有接口即内网、外网IP均可以访问。(不建议)可以绑定都多个ip上,ip地址之间用“,”分割。
port: 27017
描述:mongod/mongos侦听端口,默认为27017;不过因为mongodb有2种典型的架构模式:replica set和sharding,如果开发者在一个节点上部署多个mongod实例,需要注意修改此端口以避免冲突。
maxIncomingConnections: 65536
描述:mongod/mongos进程允许的最大连接数,如果此值超过操作系统配置的连接数阀值,将不会生效(ulimit);默认值为65536。通常客户端将会使用连接池机制,可以有效的控制每个客户端的链接个数。
wireObjectCheck: true
描述:当客户端写入数据时,mongos/mongod是否检测数据的有效性(BSON),如果数据格式不良,此insert、update操作将会被拒绝;默认值为true
ipv6: false
描述:是否支持mongos/mongod多个实例之间使用IPV6网络,默认值为false。此值需要在整个cluster中保持一致。
3、storage:
dbPath: db
描述:mongod进程存储数据目录,此配置仅对mongod进程有效。默认值为:/data/db。
indexBuildRetry: true
描述:当构建索引时mongod意外关闭,那么再次启动是否重新构建索引;索引构建失败,mongod重启后将会删除尚未完成的索引,但是否重建由此参数决定。默认值为true。
repairPath: \_tmp
描述:配合--repair启动命令参数,在repair期间使用此目录存储临时数据,repair结束后此目录下数据将被删除,此配置仅对mongod进程有效。不建议在配置文件中配置,而是使用mongod启动命令指定。
engine: mmapv1
描述:存储引擎类型,mongodb 3.0之后支持“mmapv1”、“wiredTiger”两种引擎,默认值为“mmapv1”;官方宣称wiredTiger引擎更加优秀。
journal:
enabled: true
描述:是否开启journal日志持久存储,journal日志用来数据恢复,是mongod最基础的特性,通常用于故障恢复。64位系统默认为true,32位默认为false,建议开启,仅对mongod进程有效。
directoryPerDB: false
描述:是否将不同DB的数据存储在不同的目录中,dbPath的子目录,目录名为db的名称。对已经存储数据的mongod修改此值,需要首先使用mongodump指令将数据导出,然后关闭mongod,再修改此值和指定新的dbPath,然后使用mongorestore指令重新导入数据。(即导出数据,并使用mongorestore将数据重新写入mongod的新目录中)
对于replica set架构模式,只需要在每个secondary依次操作:关闭secondary,然后配置新的dbPath,然后启动即可(会执行初始化sync,从primary中将数据去完全同步到本地)。最后操作primary。
此参数仅对mongod进程有效,默认值为false,不建议修改此值
syncPeriodSecs: 60
描述:mongod使用fsync操作将数据flush到磁盘的时间间隔,默认值为60(单位:秒),强烈建议不要修改此值;mongod将变更的数据写入journal后再写入内存,并间歇性的将内存数据flush到磁盘中,即延迟写入磁盘,有效提升磁盘效率。此指令不影响journal存储,仅对mongod有效。
mmapv1:(如下配置仅对MMAPV1引擎生效)
quota:
enforced: false
描述:配额管理,是否限制每个DB所能持有的最大文件数量,仅对mongod有效,默认值为false,建议保持默认值。
maxFilesPerDB: 8
描述:如果enforce开启,每个DB所持有的存储文件不会超过此阀值。仅对mongod进程有效。
smallFiles: false
描述:是否使用小文件存储数据;如果此值为true,mongod将会限定每个数据文件的大小为512M(默认最大为2G),journal降低到128M(默认为1G)。如果DB的数据量较大,将会导致每个DB创建大量的小文件,这对性能有一定的影响。在production环境下,不建议修改此值,在测试时可以设置为true,节约磁盘。
journal:
commitIntervalMs: 100
描述:mongod进程提交journal日志的时间间隔,即fsync的间隔。考虑到磁盘效能,mongod间歇性的flush日志数据;此值越小,数据丢失的可能性越低,磁盘消耗越大,性能越低。如果希望write操作强制立即写入journal,可以传递参数选项“j:true”(在客户端write操作中指定此选项即可),此操作(包括此前尚未提交的)将会立即fsync到磁盘。仅对mongod有效,单位:毫秒
nsSize: 每个database的namespace文件的大小,默认为16,单位:M;最大值可以设置为2048,即dbpath下“.ns”后缀文件的大小。16M基本上可以保存24000条命名条目,新建一个collection或者index信息,即会增加一个namespace条目;如果你的database下需要创建大量的collection(比如数据分析),则可以适度调大此值。
wiredTiger:(如下配置仅对wiredTiger引擎生效(3.0以上版本)
engineConfig:
cacheSizeGB: 8
描述:wiredTiger缓存工作集(working set)数据的内存大小,单位:GB,此值决定了wiredTiger与mmapv1的内存模型不同,它可以限制mongod对内存的使用量,而mmapv1则不能(依赖于系统级的mmap)。默认情况下,cacheSizeGB的值为假定当前节点只部署一个mongod实例,此值的大小为物理内存的一半;如果当前节点部署了多个mongod进程,那么需要合理配置此值。如果mongod部署在虚拟容器中(比如,lxc,cgroups,Docker)等,它将不能使用整个系统的物理内存,则需要适当调整此值。默认值为物理内存的一半。
journalCompressor: snappy
描述:journal日志的压缩算法,可选值为“none”、“snappy”、“zlib”。
directoryForIndexes: false
描述:是否将索引和collections数据分别存储在dbPath单独的目录中。即index数据保存“index”子目录,collections数据保存在“collection”子目录。默认值为false,仅对mongod有效。
collectionConfig:
blockCompressor: snappy
描述:collection数据压缩算法,可选值“none”、“snappy”、“zlib”。开发者在创建collection时可以指定值,以覆盖此配置项。如果mongod中已经存在数据,修改此值不会带来问题,旧数据仍然使用原来的算法解压,新数据文件将会采用新的解压缩算法。
indexConfig:
prefixCompression: true
描述:是否对索引数据使用“前缀压缩”(prefix compression,一种算法)。前缀压缩,对那些经过排序的值存储,有很大帮助,可以有效的减少索引数据的内存使用量。默认值为true。
4、operationProfiling:
slowOpThresholdMs: 100
描述:数据库profiler判定一个操作是“慢查询”的时间阀值,单位毫秒;mongod将会把慢查询记录到日志中,即使profiler被关闭。当profiler开启时,慢查询记录还会被写入“system.profile”这个系统级的collection中。请参看mongod profiler相关文档。默认值为100,此值只对mongod进程有效。
mode: off
描述:数据库profiler级别,操作的性能信息将会被写入日志文件中,可选值:
1)off:关闭profiling
2)slowOp:on,只包含慢操作日志
3)all:on,记录所有操作
数据库profiling会影响性能,建议只在性能调试阶段开启。此参数仅对mongod有效。
5、replication:(复制集架构模式配置,如果只是单点,则无需配置)
oplogSizeMB: 10240
描述:replication操作日志的最大尺寸,单位:MB。mongod进程根据磁盘最大可用空间来创建oplog,比如64位系统,oplog为磁盘可用空间的5%,一旦mongod创建了oplog文件,此后再次修改oplogSizeMB将不会生效。此值不要设置的太小, 应该足以保存24小时的操作日志,以保证secondary有充足的维护时间;如果太小,secondary将不能通过oplog来同步数据,只能全量同步。此值仅对mongod有效。
enableMajorityReadConcern: false
描述:是否开启readConcern的级别为“majority”,默认为false;只有开启此选项,才能在read操作中使用“majority”。(3.2+版本)
replSetName: <无默认值>
描述:“复制集”的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName。仅对mongod有效。
secondaryIndexPrefetch: all
描述:只对mmapv1存储引擎有效。复制集中的secondary,从oplog中运用变更操作之前,将会先把索引加载到内存中,默认情况下,secondaries首先将操作相关的索引加载到内存,然后再根据oplog应用操作。可选值:
1)none:secondaries不将索引数据加载到内容
2)all:sencondaries将此操作有关的索引数据加载到内存
3)\_id\_only:只加载\_id索引
默认值为:all,此配置仅对mongod有效。
localPingThresholdMs: 15
描述:ping时间,单位:毫秒,mongos用来判定将客户端read请求发给哪个secondary。仅对mongos有效。默认值为15,和客户端driver中的默认值一样。当mongos接收到客户端read请求,它将:
1、找出复制集中ping值最小的member。
2、将延迟值被此值允许的members,构建一个列表
3、从列表中随机选择一个member。
ping值是动态值,每10秒计算一次。mongos将客户端请求转发给延迟较小(与此值相比)的某个secondary节点。仅对mongos有效。
6、sharding:(仅对sharding架构模式下有效)
clusterRole: <无默认值>
描述:在sharding集群中,此mongod实例的角色,可选值:
1、configsvr:此实例为config server,此实例默认侦听27019端口
2、shardsvr:此实例为shard(分片),侦听27018端口
此配置仅对mongod有效。通常config server和sharding server需要使用各自的配置文件。
archiveMovedChunks: true
描述:当chunks因为“负载平衡”而迁移到其他节点时,mongod是否将这些chunks归档,并保存在dbPath下“moveChunk”目录下,mongod不会删除moveChunk下的文件。默认为true。
autoSplit: true
描述:是否开启sharded collections的自动分裂,仅对mongos有效。如果所有的mongos都设定为false,那么collections数据增长但不能分裂成新的chunks。因为集群中任何一个mongos进程都可以触发split,所以此值需要在所有mongos行保持一致。仅对mongos有效。
configDB: <无默认值>
描述:设定config server的地址列表,每个server地址之间以“,”分割,通常sharded集群中指定1或者3个config server。(生产环境,通常是3个config server,但1个也是可以的)。所有的mongos实例必须配置一样,否则可能带来不必要的问题。仅对mongos有效。
chunkSize: 64
描述:sharded集群中每个chunk的大小,单位:MB,默认为64,此值对于绝大多数应用而言都是比较理想的。chunkSize太大会导致分布不均,太小会导致分裂成大量的chunk而经常移动
##整个sharding集群中,此值需要保持一致,集群启动后修改此值将不再生效。仅对mongos有效。
7、sytemsLog:(系统日志,必须配置)
verbosity: 0
描述:日志级别,0:默认值,包含“info”信息,1~5,即大于0的值均会包含debug信息
quiet: true
描述:"安静",此时mongod/mongos将会尝试减少日志的输出量。不建议在production环境下开启,否则将会导致跟踪错误比较困难。
traceAllExceptions: true
描述:打印异常详细信息。
path: logs/mongod.log
logAppend: false
描述:如果为true,当mongod/mongos重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为false。
logRotate: rename
描述:日志“回转”,防止一个日志文件特别大,则使用logRotate指令将文件“回转”,可选值:
1)rename:重命名日志文件,默认值。
2)reopen:使用linux日志rotate特性,关闭并重新打开此日志文件,可以避免日志丢失,但是logAppend必须为true。
destination: file
描述:日志输出目的地,可以指定为“ file”或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)。
重要配置参数讲解
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /srv/mongodb/keyfile
javascriptEnabled: true
setParameter:
enableLocalhostAuthBypass: true
authenticationMechanisms: SCRAM-SHA-1
1)authorization:disabled或者enabled,仅对mongod有效;表示是否开启用户访问控制(Access Control),即客户端可以通过用户名和密码认证的方式访问系统的数据,默认为“disabled”,即客户端不需要密码即可访问数据库数据。(限定客户端与mongod、mongos的认证)
2)clusterAuthMode:集群中members之间的认证模式,可选值为“keyFile”、“sendKeyFile”、“sendX509”、“x509”,对mongod/mongos有效;默认值为“keyFile”,mongodb官方推荐使用x509,不过我个人觉得还是keyFile比较易于学习和使用。不过3.0版本中,mongodb增加了对TLS/SSL的支持,如果可以的话,建议使用SSL相关的配置来认证集群的member,此文将不再介绍。(限定集群中members之间的认证)
3)keyFile:当clusterAuthMode为“keyFile”时,此参数指定keyfile的位置,mongodb需要有访问此文件的权限。
4)javascriptEnabled:true或者false,默认为true,仅对mongod有效;表示是否关闭server端的javascript功能,就是是否允许mongod上执行javascript脚本,如果为false,那么mapreduce、group命令等将无法使用,因为它们需要在mongod上执行javascript脚本方法。如果你的应用中没有mapreduce等操作的需求,为了安全起见,可以关闭javascript。
“setParameter”允许指定一些的Server端参数,这些参数不依赖于存储引擎和交互机制,只是微调系统的运行状态,比如“认证机制”、“线程池参数”等。参见【parameter】
1)enableLocalhostAuthBypass:true或者false,默认为true,对mongod/mongos有效;表示是否开启“localhost exception”,对于sharding cluster而言,我们倾向于在mongos上开启,在shard节点的mongod上关闭。
2)authenticationMechanisms:认证机制,可选值为“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建议为“SCRAM-SHA-1”,对mongod/mongos有效;一旦选定了认证机制,客户端访问databases时需要与其匹配才能有效。
与安全有关的配置
setParameter:
connPoolMaxShardedConnsPerHost: 200
connPoolMaxConnsPerHost: 200
notablescan: 0
1)connPoolMaxShardedConnsPerHost:默认值为200,对mongod/mongos有效;表示当前mongos或者shard与集群中其他shards链接的链接池的最大容量,此值我们通常不会调整。连接池的容量不会阻止创建新的链接,但是从连接池中获取链接的个数不会超过此值。维护连接池需要一定的开支,保持一个链接也需要占用一定的系统资源。
2)connPoolMaxConnsPerHost:默认值为200,对mongod/mongos有效;同上,表示mongos或者mongod与其他mongod实例之间的连接池的容量,根据host限定。
与性能有关的参数
mongodb 3.0之后配置文件采用YAML格式,这种格式非常简单,使用
systemLog:
quiet: false
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath: /data/mongodb/mongod.pid
net:
bindIp: 127.0.0.1
port: 27017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
storage:
dbPath: /data/mongodb/db
indexBuildRetry: true
journal:
enabled: true
directoryPerDB: false
engine: mmapv1
syncPeriodSecs: 60
mmapv1:
quota:
enforced: false
maxFilesPerDB: 8
smallFiles: true
journal:
commitIntervalMs: 100
wiredTiger:
engineConfig:
cacheSizeGB: 8
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
operationProfiling:
slowOpThresholdMs: 100
mode: off
mongod.conf
如果你的架构模式为replication Set,那么还需要在所有的“复制集”members上增加如下配置:
replication:
oplogSizeMB: 10240
replSetName: rs0
secondaryIndexPrefetch: all
如果为sharding Cluster架构,则需要在shard节点增加如下配置:
sharding:
clusterRole: shardsvr
archiveMovedChunks: true
当然,一个mongod实例即可以为“复制集”的member之一,也可以作为sharding集群中的一个分片,这取决你的架构模式。
mongod进程可以做为“config server”实例,只需要将“clusterRole: configsvr”即可;由此可见,一个mongod实例可以为“单点实例”、“config server”、“sharding server” + “replication set member”其中一个角色,建议使用不同的配置文件启动它。
systemLog:
quiet: false
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath: /data/mongodb/mongod.pid
net:
bindIp: 127.0.0.1
port: 37017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
replication:
localPingThresholdMs: 15
sharding:
autoSplit: true
configDB: m1.com:27018,m2.com:27018,m3.com:27018
chunkSize: 64
mongos.conf
mongos实例不需要存储实际的数据,对内存有一定的消耗,在sharding架构模式下使用;mongos需接收向客户端请求(后端的sharded和replication set则不需要让客户端知道),它可以将客户端请求转发到一个分片集群上(分片集群基于复制集)延迟相对较小的secondary上,同时还负责chunk的分裂和迁移工作。
配置文件中绝大部分参数,都可以通过进程启动命令指定,通常启动命令行中的参数将覆盖配置文件中的参数。
./mongod -f mongod.conf
当然,也可以通过使用多个命令行参数来启动,如下仅为示例:
./mongod --bind_ip 127.0.0.1 --port 27017 --dbpath /data/mongodb/db --logpath /data/mongodb/logs --storageEngine mmapv1 --fork
mongod配置中所指定的目录地址必须首先创建,否则将无法启动,这有别与其他系统
mongos启动方式同上。如果希望基于service方式启动mongod、mongos,请参考其他文档。
可以通过kill指令来关闭mongod进程,不过这种方式有些粗暴,在production环境中可能会导致数据损坏,建议使用mongo shell来“cleanly”关闭mongod进程,这种方式安全而且不会导致数据损坏。
./mongo
use admin;
db.shutdownServer();
可以使用“kill
“修复”数据库,当mongodb运行一段时间之后,特别是经过大量删除、update操作之后,我们可以使用repair指令对数据存储进行“repair”,它将整理、压缩底层数据存储文件,重用磁盘空间,相当于数据重新整理了一遍,对数据优化有一定的作用。
如果mongod没有开启journaling日志功能,repair指令可以在系统异常crash之后,用于整理数据、消除损坏数据;如果开启了journaling日志功能,我们则需不要使用repair来修复数据,因为journal就可以帮助mongod恢复数据。在replication set模式下,可以使用repair,但是通常可以直接删除旧数据,使用“数据同步”操作,即可达到“恢复”、“整理”数据的目的,效果和repair一样,而且效率更高。
repair需要磁盘有一定的剩余空间,为当前database数据量 + 2GB,可以通过使用“--repairpath”来指定repair期间存储临时数据的目录。repair指令还会重建indexes,可以降低索引的数据大小。
如果mongod意外crash,需要首先正常启动mongod,让根据journal日志恢复完数据之后,才能执行repair;如果journal日志有数据尚未恢复,那么使用repair指令启动mongod将会失败。
repair时需要关闭mongod进程,执行完毕后再启动。
./mongod --dbpath=/data/mongodb/db --repair
mongodb比较倾向于使用shell来repair特定的database,这个操作相对比较可控,其内部工作机制一样。
>./mongo
user mydatabase;
db.repairDatabase();
我们通常会使用到mongodb数据的备份功能,或者将一个备份导入到一个新的mongod实例中(数据冷处理),那么就需要借助这两个指令。
mongodump将整个databases全部内容导出到一个二进制文件中,可以在其他mongod使用mongorestore来加载整个文件。需要注意mongodump不会导出“local”数据库中的数据,当然这个local库对恢复数据也没有太大意义。
“-u”参数指定访问database的用户名,“-p”指定密码,“--host”和“--port”指定mongod实例的位置,“--db”指定需要dump的数据库,如果不指定则dump所有数据库,“--collection”指定需要dump的集合表,如果不指定则dumpl整个db下的所有collections;“--query
>./mongodump --host m1.com --port 27017 -u root -p pass --out /data/mongodb/backup/dump_2015_10_10
mongorestore则将dump的数据文件导入到database,mongorestore可以创建新的database或者将数据添加到现有的database中。如果将数据restore到已经存在的database中,mongorestore仅执行insert,不会执行update,如果数据库中已经存在相同的“_id”数据,mongorestore不会覆盖原有的document。mongorestore会重新创建indexes,所有的操作都是insert而不会update。
基本指令类似于mongodump,“--db”指定需要将数据restore到哪个db中,如果此db不存在,则创建;如果没有指定“--db”,mongorestore则根据原始数据所属的db重新创建,这可能会导致数据覆盖。“--drop”表示在restore数据之前,首先删除目标db中原有的collections,--drop不会删除那些在dump文件中没有的collection。“--stopOnError”表示出错时强制退出。
./mongorestore --db mydatabase /data/mongodb/backup/dump_2015_10_10
mongoexport将数据导出为JSON或者CSV格式,以便其他应用程序解析。
因为mongodb数据是BSON格式,有些数据类型是JSON不具有的,所以导出JSON格式会仍然会丢失数据类型;所以如果导出的数据是准备给其他mongodb恢复数据,那么建议使用mongodump和mongorestore。
命令参数同3.1.3.3)
可以间歇性的打印出当前mongod实例中“数据存储”、“flush”、读写次数、网络输出等参数,是查看mongod性能的有效手段。mongotop可以根据查看各个database下读写情况。
1)help:列出所有的function
2)show dbs:展示当前实例中所有的databases。
3)use
4)show collections:展示出当前db中所有的collections。
5)show users:展示当前db中已经添加的所有用户。
6)show roles:展示当前db中所有内置的或者自定义的用户角色。
7)show profile:这涉及到profile相关的配置,默认情况下展示出最近5个操作耗时超过1秒的操作,通常用于跟踪慢查询。
8)db.help():展示出可以在db上进行的操作function。
9)db.
角色分类
角色
权限及角色
(本文大小写可能有些变化,使用时请参考官方文档)
Database User Roles
read
CollStats,dbHash,dbStats,find,killCursors,listIndexes,listCollections
readWrite
CollStats,ConvertToCapped,CreateCollection,DbHash,DbStats,
DropCollection,CreateIndex,DropIndex,Emptycapped,Find,
Insert,KillCursors,ListIndexes,ListCollections,Remove,
RenameCollectionSameDB,update
Database Administration Roles
dbAdmin
collStats,dbHash,dbStats,find,killCursors,listIndexes,listCollections,
dropCollection 和 createCollection 在 system.profile
dbOwner
角色:readWrite, dbAdmin,userAdmin
userAdmin
ChangeCustomData,ChangePassword,CreateRole,CreateUser,
DropRole,DropUser,GrantRole,RevokeRole,ViewRole,viewUser
Cluster Administration Roles
clusterAdmin
角色:clusterManager, clusterMonitor, hostManager
clusterManager
AddShard,ApplicationMessage,CleanupOrphaned,FlushRouterConfig,
ListShards,RemoveShard,ReplSetConfigure,ReplSetGetStatus,
ReplSetStateChange,Resync,
EnableSharding,MoveChunk,SplitChunk,splitVector
clusterMonitor
connPoolStats,cursorInfo,getCmdLineOpts,getLog,getParameter,
getShardMap,hostInfo,inprog,listDatabases,listShards,netstat,
replSetGetStatus,serverStatus,shardingState,top
collStats,dbStats,getShardVersion
hostManager
applicationMessage,closeAllDatabases,connPoolSync,cpuProfiler,
diagLogging,flushRouterConfig,fsync,invalidateUserCache,killop,
logRotate,resync,setParameter,shutdown,touch,unlock
Backup and Restoration Roles
backup
提供在admin数据库mms.backup文档中insert,update权限
列出所有数据库:listDatabases
列出所有集合索引:listIndexes
对以下提供查询操作:find
*非系统集合
*系统集合:system.indexes, system.namespaces, system.js
*集合:admin.system.users 和 admin.system.roles
restore
非系统集合、system.js,admin.system.users 和 admin.system.roles 及2.6 版本的system.users提供以下权限:
collMod,createCollection,createIndex,dropCollection,insert
列出所有数据库:listDatabases
system.users :find,remove,update
All-Database Roles
readAnyDatabase
提供所有数据库中只读权限:read
列出集群所有数据库:listDatabases
readWriteAnyDatabase
提供所有数据库读写权限:readWrite
列出集群所有数据库:listDatabases
userAdminAnyDatabase
提供所有用户数据管理权限:userAdmin
Cluster:authSchemaUpgrade,invalidateUserCache,listDatabases
admin.system.users和admin.system.roles:
collStats,dbHash,dbStats,find,killCursors,planCacheRead
createIndex,dropIndex
dbAdminAnyDatabase
提供所有数据库管理员权限:dbAdmin
列出集群所有数据库:listDatabases
Superuser Roles
root
角色:dbOwner,userAdmin,userAdminAnyDatabase
readWriteAnyDatabase, dbAdminAnyDatabase,
userAdminAnyDatabase,clusterAdmin
Internal Role
__system
集群中对任何数据库采取任何操作
由于Mongo3.X的yum 如果从官网安装,那么下载速度会很慢,所以这里使用源码安装的方式,文件夹以及配置文件、环境变量服务控制脚本这里需要自己准备。
1.首先解压Mongo3.X源码包,然后创建目录文件。
[root@CentOS7 tools]# tar zxf mongodb-linux-x86_64-3.4.10.tgz -C /usr/local/
[root@CentOS7 tools]# mv /usr/local/mongodb-linux-x86_64-3.4.10/ /usr/local/mongodb
[root@CentOS7 /]# mkdir -p /usr/local/mongodb/{conf,data,keyfile,logs,tmp}
2. 将mongodb的bin加入环境变量
[root@CentOS7 /]# echo 'export PATH=$PATH:/usr/local/mongodb/bin' >> /etc/profile ; source /etc/profile
3. Mongod配置文件。
这里其它不做配置,保证环境能正常运行即可
因为这里拷贝的配置是yum文件自带配置,所以这里的配置信息大多数保持默认
[root@CentOS7 /]# egrep -v "^#|^$" /etc/mongod.conf.bak
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb/logs/mongod.log
storage:
dbPath: /usr/local/mongodb/data
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb/tmp/mongod.pid # location of pidfile
net:
port: 27017
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
security:
authorization: enabled
4. Mongodo服务脚本
Centos6
由于centos6一般使用yum文件,里面已经自带了方法,但为了防止centos6安装3.X版本,这里贴出一份服务脚本供参考。
#!/bin/sh
#mongod - Startup script for mongod
. /etc/rc.d/init.d/functions
OPTIONS=" -f /etc/mongod.conf"
#mongod
mongod="/usr/local/mongodb/bin/mongod"
lockfile=/usr/local/mongodb/keyfile/mongod
start()
{
echo -n $"Starting mongod: "
$mongod $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $lockfile
}
stop()
{
echo -n $"Stopping mongod: "
killproc $mongod -QUIT
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $lockfile
}
restart () {
stop
start
}
ulimit -n 12000
RETVAL=0
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload|force-reload)
restart
;;
condrestart)
[ -f $lockfile ] && restart || :
;;
status)
status $mongod
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
RETVAL=1
esac
exit $RETVAL
mongod
Centos7
Centos7方式已全部改变,请参考Centos7 system 服务文档。这里贴出一个centos7 mongod的控制脚本
[Unit]
Description=mongo
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/mongodb/tmp/mongod.pid
ExecStart=/usr/local/mongodb/bin/mongod -f /etc/mongod.conf.bak
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
mongod.service
5. (可选)或者直接使用命令
mongod -f 配置文件
MongoDB中的数据具有灵活的模式。文档在同一集合,但它们不需要具有相同的字段或结构集合,集合文档中的公共字段可以包含不同类型的数据。
MongoDB中的数据具有灵活的模式。与SQL数据库不同,SQL数据库必须在插入数据之前确定和声明表的模式,MongoDB的集合不会强制执行文档结构。这种灵活性有助于将文档映射到实体或对象。 每个文档可以匹配表示实体的数据字段,即使数据具有实质性的变化。然而,集合中的文档具有类似的结构。
数据建模中的关键挑战是平衡应用程序的需求,数据库引擎的性能特征和数据检索模式。 在设计数据模型时,请始终考虑数据的应用程序使用情况(即数据的查询,更新和处理)以及数据本身的固有结构。
在MongoDB中设计架构时有一些考虑:
实例
假设客户需要他的博客/网站的数据库设计,并查看RDBMS和MongoDB架构设计之间的区别。网站有以下要求。
每个帖子都有唯一的标题,描述和网址。
每个帖子都可以有一个或多个标签。
每个帖子都有其发布者的名称和总人数。
每个帖子都有用户给出的评论以及他们的姓名,消息,数据时间和喜好。
每个帖子可以有零个或多个评论。
在RDBMS架构中,上述要求的设计将具有最少的三个表。表与表之间的关系如下 -
而在MongoDB模式中,设计将有一个集合post,其结构以下 –
{
_id: POST_ID
title: TITLE_OF_POST,
description: POST_DESCRIPTION,
by: POST_BY,
url: URL_OF_POST,
tags: [TAG1, TAG2, TAG3],
likes: TOTAL_LIKES,
comments: [
{
user:'COMMENT\_BY',
message: TEXT,
dateCreated: DATE\_TIME,
like: LIKES
},
{
user:'COMMENT\_BY',
message: TEXT,
dateCreated: DATE\_TIME,
like: LIKES
}
]
}
通过上面的示例说明可以知道,在显示数据时,在RDBMS中需要连接三个表,而在MongoDB中,数据将仅显示在一个集合中
MongoDB使用 use DATABASE_NAME
命令来创建数据库。如果指定的数据DATABASE_NAME
不存在,则该命令将创建一个新的数据库,否则返回现有的数据库。
语法
use DATABASE
语句的基本语法如下 -
use DATABASE_NAME
示例
如果要创建一个名称为<newdb>
的数据库,那么使用use DATABASE
语句将如下所示:
> use lizexiong
switched to db lizexiong
要检查当前选择的数据库,请使用 db 命令 -
>db
newdb
如果要检查数据库列表,请使用命令:show dbs
。
>show dbs
local 0.000025GB
test 0.00002GB
创建的数据库(newdb)不在列表中。要显示数据库,需要至少插入一个文档,空的数据库是不显示出来的。
>db.name.insert({"name":" lizexiong"})
show dbs
local 0.00005GB
test 0.00002GB
lizexiong 0.00002GB
在 MongoDB 中默认数据库是:test。 如果您还没有创建过任何数据库,则集合/文档将存储在test数据库中。
MongoDB中的 db.dropDatabase()命令用于删除现有的数据库。
db.dropDatabase()
这将删除当前所选数据库。如果没有选择任何数据库,那么它将删除默认的’test‘数据库。
示例
首先,使用命令show dbs
检查可用数据库的列表
> show dbs;
admin 0.000GB
lizexiong 0.000GB
local 0.000GB
use lizexiong
switched to db lizexiong
db.dropDatabase()
{ "dropped" : "lizexiong", "ok" : 1 }
#最后检查结果
show dbs
admin 0.000GB
local 0.000GB
MongoDB 的db.createCollection(name``,options)
方法用于在MongoDB 中创建集合。
createCollection()命令的基本语法如下
db.createCollection(name, options)
在命令中,name 是要创建的集合的名称。options是一个文档,用于指定集合的配置。
参数
类型
描述
name
String
要创建的集合的名称
options
Document
(可选)指定有关内存大小和索引的选项
options
参数是可选的,因此只需要指定集合的名称。 以下是可以使用的选项列表:
capped
Boolean
(可选)如果为true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大大小时自动覆盖其最旧的条目。 如果指定true,则还需要指定size参数。
autoIndexId
Boolean
(可选)如果为true,则在_id字段上自动创建索引。默认值为false。
size
数字
(可选)指定上限集合的最大大小(以字节为单位)。 如果capped为true,那么还需要指定此字段的值。
max
数字
(可选)指定上限集合中允许的最大文档数。
在插入文档时,MongoDB首先检查上限集合capped
字段的大小,然后检查max
字段。
例子
没有使用选项的createCollection()
方法的基本语法如下
>use test
switched to db test
db.createCollection("mycollection")
{ "ok" : 1 }
可以使用命令show collections检查创建的集合。
>show collections
mycollection
以下示例显示了createCollection()方法的语法,其中几个重要选项
> db.createCollection("mycol", {capped : true, autoIndexId : true, size : 6142800, max : 10000 })
{ "ok" : 1 }
在 MongoDB 中,不需要创建集合。当插入一些文档时,MongoDB 会自动创建集合。
>db.newcollection.insert({"name" : "lizexiong"})
show collections
mycol
newcollection
mycollection
MongoDB 的 db.collection.drop()
用于从数据库中删除集合。
语法
drop()命令的基本语法如下
db.COLLECTION_NAME.drop()
示例
首先,检查数据库 test 中可用的集合。
>use test
switched to db test
show collections
mycol
mycollection
newcollection
现在删除名称为mycollection 的集合。
>db.mycollection.drop()
true
如果选定的集合成功删除,drop()
方法将返回true
,否则返回false
。
MongoDB支持许多数据类型。 其中一些是
要将数据插入到 MongoDB 集合中,需要使用 MongoDB 的 insert()
或save()
方法。
语法
insert()命令的基本语法如下:
>db.COLLECTION_NAME.insert(document)
示例
db.mycol.insert({
_id: 100,
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'yiibai tutorials',
url: 'http://www.huawei.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
})
这里mycol是集合的名称,在前一章中所创建的。如果数据库中不存在集合,则MongoDB将创建此集合,然后将文档插入到该集合.
在插入的文档中,如果不指定_id参数,那么 MongoDB 会为此文档分配一个唯一的ObjectId。_id为集合中的每个文档唯一的12个字节的十六进制数。 12字节划分如下 -
_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id,
3 bytes incrementer)
要在单个查询中插入多个文档,可以在insert()命令中传递文档数组。如下所示
> db.mycol.insert([
{
\_id: 101,
title: 'MongoDB Guide',
description: 'MongoDB is no sql database',
by: 'yiibai tutorials',
url: 'http://www.huawei.com',
tags: \['mongodb', 'database', 'NoSQL'\],
likes: 100
},
{
\_id: 102,
title: 'NoSQL Database',
description: "NoSQL database doesn't have tables",
by: 'yiibai tutorials',
url: 'http://www.huawei.com',
tags: \['mongodb', 'database', 'NoSQL'\],
likes: 210,
comments: \[
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2017,11,10,2,35),
like: 0
}
\]
},
{
\_id: 104,
title: 'Python Quick Guide',
description: "Python Quick start ",
by: 'yiibai tutorials',
url: 'http://www.huawei.com',
tags: \['Python', 'database', 'NoSQL'\],
likes: 30,
comments: \[
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2018,11,10,2,35),
like: 590
}
\]
}
])
成功结果为:
BulkWriteResult({
"writeErrors" : \[ \],
"writeConcernErrors" : \[ \],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : \[ \]
})
要插入文档,也可以使用db.post.save(document)
。 如果不在文档中指定_id
,那么save()
方法将与insert()
方法一样自动分配ID的值。如果指定_id
,则将以save()
方法的形式替换包含_id
的文档的全部数据。
db.collection.insertOne()
方法将单个文档插入到集合中。以下示例将新文档插入到库存集合中。 如果文档没有指定_id
字段,MongoDB会自动将_id
字段与ObjectId
值添加到新文档。
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
db.collection.insertOne()
方法返回包含新插入的文档的`_id```字段值的文档。
执行结果如下
> db.inventory.insertOne(
… { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
… )
{
"acknowledged" : true,
"insertedId" : ObjectId("5a5719d8ddd1e4ed6d858660")
db.collection.insertMany()
方法将多个文档插入到集合中,可将一系列文档传递给db.collection.insertMany()
方法。以下示例将三个新文档插入到库存集合中。如果文档没有指定_id
字段,MongoDB会向每个文档添加一个ObjectId值的_id
字段。
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
insertMany()
返回包含新插入的文档_id
字段值的文档。执行结果如下
> db.inventory.insertMany([
… { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
… { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
… { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
… ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a571a8addd1e4ed6d858661"),
ObjectId("5a571a8addd1e4ed6d858662"),
ObjectId("5a571a8addd1e4ed6d858663")
]
}
要从MongoDB集合查询数据,需要使用MongoDB的find()
方法。
语法
find()命令的基本语法如下:
>db.COLLECTION_NAME.find(document)
Shell
find()方法将以非结构化的方式显示所有文档。
pretty()方法
要以格式化的方式显示结果,可以使用pretty()方法。
语法
> db.mycol.find().pretty()
示例
>db.mycol.find().pretty()
{
"_id": 100,
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "yiibai tutorials",
"url": "http://www.huawei.com",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
除了find()
方法外,还有一个findOne()
方法,它只返回一个文档。
要在一些条件的基础上查询文档,可以使用以下操作。
操作
语法
示例
RDBMS等效语句
相等
{
db.mycol.find({"by":"yiibai"}).pretty()
where by = 'yiibai'
小于
{
db.mycol.find({"likes":{$lt:50}}).pretty()
where likes < 50
小于等于
{
db.mycol.find({"likes":{$lte:50}}).pretty()
where likes <= 50
大于
{
db.mycol.find({"likes":{$gt:50}}).pretty()
where likes > 50
大于等于
{
db.mycol.find({"likes":{$gte:50}}).pretty()
where likes >= 50
不等于
{
db.mycol.find({"likes":{$ne:50}}).pretty()
where likes != 50
下面我们将对上表中的所有操作演示
MongoDB中的AND操作符
语法
在find()方法中,如果通过使用’,‘将它们分开传递多个键,则 MongoDB 将其视为AND条件。 以下是AND的基本语法 -
>db.mycol.find(
{
$and: [
{key1: value1}, {key2:value2}
]
}
).pretty()
示例
以下示例将显示由“yiibai tutorials
”编写并且标题为“MongoDB Overview”的所有教程。
> db.mycol.find({$and:[{"by":"yiibai tutorials"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id" : 100,
"title" : "MongoDB Overview",
"description" : "MongoDB is no sql database",
"by" : "yiibai tutorials",
"url" : "http://www.huawei.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
对于上面给出的例子,等效的SQL where
子句是
SELECT * FROM mycol where by ='yiibai tutorials' AND title ='MongoDB Overview'
可以在find子句中传递任意数量的键值。
MongoDB中的OR操作符
语法
在要根据OR条件查询文档,需要使用$or关键字。 以下是OR条件的基本语法
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
示例
以下示例将显示由“yiibai tutorials”编写或标题为“MongoDB Overview”的所有教程。
> db.mycol.find({$or:[{"by":"yiibai tutorials"},{"title": "MongoDB Overview"}]}).pretty()
使用 AND 和 OR 条件一起
示例
以下示例将显示likes大于10以及标题是“MongoDB Overview”或者“yiibai tutorials”的所有文档。 等价SQL where子句为
SELECT * FROM mycol where likes> 10 AND(by ='yiibai tutorials' OR title ='MongoDB Overview')
db.mycol.find({"likes": {$gt:10}, $or: [{"by": "yiibai tutorials"},
{"title": "MongoDB Overview"}]}).pretty()
这里演示如何使用:db.collection.find()方法对嵌入/嵌套文档的查询操作的示例。 此页面上的示例使用inventory集合。要填充库存(inventory)集合以准备一些数据,请运行以下命令:
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
要在作为嵌入/嵌套文档的字段上指定相等条件,请使用查询过滤器文档{<field>``:<value>}
,其中<value>
是要匹配的文档。
例如,以下查询选择字段size
等于{ h: 14, w: 21, uom: "cm" }
的所有文档:
> db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
{ "_id" : ObjectId("5a572a08ddd1e4ed6d858664"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
整个嵌入式文档中的相等匹配需要精确匹配指定的
例如,以下查询与库存(inventory)集合中的任何文档不匹配:
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )
查询过滤器文档可以使用查询运算符来指定,如以下形式的条件:
{
以下查询使用size字段中嵌入的字段h中的小于运算符($lt):
db.inventory.find( { "size.h": { $lt: 15 } } )
以下查询选择嵌套字段h小于15的所有文档,嵌套字段uom等于“in”,status字段等于“D”:
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
MongoDB的update()
和save()
方法用于将集合中的文档更新。update()
方法更新现有文档中的值,而save()
方法使用save()
方法中传递的文档数据替换现有文档。
语法
update()方法的基本语法如下
> db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
示例
考虑mycol
集合具有以下数据(以下数据只是一部分,并非查询出来的)
db.mycol.find({}, {'_id':1, 'title':1})
{ "_id" : 100, "title" : "MongoDB Overview" }
{ "_id" : 101, "title" : "MongoDB Guide" }
{ "_id" : 102, "title" : "NoSQL Database" }
{ "_id" : 104, "title" : "Python Quick Guide" }
以下示例将为标题为“MongoDB Overview
”的文档设置为“New Update MongoDB Overview
”。
> db.mycol.find({'title':'MongoDB Overview'},{'_id':1, 'title':1})
{ "_id" : 100, "title" : "MongoDB Overview" }
更新操作
db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New Update MongoDB Overview'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })查询更新后的结果 -
db.mycol.find({'_id':100},{'_id':1, 'title':1})
{ "_id" : 100, "title" : "New Update MongoDB Overview" }
MongoDB中的 remove()方法用于从集合中删除文档。 remove()方法接受两个参数。 一个是删除条件,第二个是标志:justOne。
语法
remove()方法的基本语法如下
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
示例
以下示例将删除_id
为“100
”的文档。
> db.mycol.remove({'_id':100})
WriteResult({ "nRemoved" : 1 })
如果有多条记录,并且只想删除第一条记录,则在remove()
方法中设置justOne
参数。
如果不指定删除条件,MongoDB 将删除集合中的所有文档。 这相当于SQL的truncate
命令。
>db.mycol.remove({})
在MongoDB中,投影表示仅选择所需要字段的数据,而不是选择整个文档字段的数据。如果某个文档有5
个字段,但只要显示3
个字段,那么就只选择3
个字段吧,这样做是非常有好处的。
MongoDB的find()
方法,在 MongoDB 查询文档中此方法接收的第二个可选参数是要检索的字段列表。 在MongoDB中,当执行find()
方法时,它默认将显示文档的所有字段。为了限制显示的字段,需要将字段列表对应的值设置为1
或0
。1
用于显示字段,而0
用于隐藏字段。
具有投影的find()
方法的基本语法如下:
语法
>db.COLLECTION_NAME.find({},{KEY:1})
示例
以下示例将在查询文档时只显示文档的标题。
> db.mycol.find({}, {'title':1,'_id':0})
{ "title" : "MongoDB Guide" }
{ "title" : "NoSQL Database" }
{ "title" : "Python Quick Guide" }
{ "title" : "MongoDB Overview" }
db.mycol.find({}, {'title':1,'by':1, 'url':1})
{ "_id" : 101, "title" : "MongoDB Guide", "by" : "yiibai tutorials", "url" : "http://www.huawei.com" }
{ "_id" : 102, "title" : "NoSQL Database", "by" : "yiibai tutorials", "url" : "http://www.huawei.com" }
{ "_id" : 104, "title" : "Python Quick Guide", "by" : "yiibai tutorials", "url" : "http://www.huawei.com" }
请注意,在执行find()
方法时,始终都会显示_id
字段,如果不想要此字段,则需要将其设置为0
。
要限制 MongoDB 中返回的记录数,需要使用limit()方法。 该方法接受一个数字类型参数,它是要显示的文档数。
语法
limit()方法的基本语法如下:
> db.COLLECTION_NAME.find().limit(NUMBER)
示例
以下示例将在查询文档时仅显示两个文档。
> db.mycol.find({},{"title":1,_id:0}).limit(2)
{ "title" : "MongoDB Guide" }
{ "title" : "NoSQL Database" }
除了limit()
方法之外,还有一个方法skip()
也接受数字类型参数,用于跳过文档数量。
语法
skip()方法的基本语法如下
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
示例
以下示例将仅显示第三个文档。
> db.mycol.find({},{"title":1,_id:0}).limit(1).skip(2)
{ "title" : "Python Quick Guide" }
Shell
请注意,skip()方法中的默认值为0。
要在MongoDB中排序文档,需要使用sort()
方法。 该方法接受包含字段列表及其排序顺序的文档。使用指定排序顺序1
和-1
。 1
用于升序,而-1
用于降序。
语法
sort()方法的基本语法如下
>db.COLLECTION_NAME.find().sort({KEY:1})
示例
以下示例将按标题降序排序显示文档。
> ## 按`title`降序排序
db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{ "title" : "Python Quick Guide" }
{ "title" : "NoSQL Database" }
{ "title" : "MongoDB Overview" }
{ "title" : "MongoDB Guide" }按`title`升序排序
db.mycol.find({},{"title":1,_id:0}).sort({"title":1})
{ "title" : "MongoDB Guide" }
{ "title" : "MongoDB Overview" }
{ "title" : "NoSQL Database" }
{ "title" : "Python Quick Guide" }
要创建索引,需要使用MongoDB的ensureIndex()方法。
语法
ensureIndex()方法的基本语法如下
>db.COLLECTION_NAME.ensureIndex({KEY:1})
这里的key是要在其上创建索引的字段的名称,1是升序。 要按降序创建索引,需要使用-1。
示例
>db.mycol.ensureIndex({"title":1})
在ensureIndex()方法中,可以传递多个字段,以在多个字段上创建索引。
>db.mycol.ensureIndex({"title":1,"description":-1})
聚合操作处理数据记录并返回计算结果。 聚合操作将多个文档中的值组合在一起,并可对分组数据执行各种操作,以返回单个结果。 在SQL中的 count(*)
与group by
组合相当于mongodb 中的聚合功能。
对于MongoDB中的聚合,应该使用aggregate()
方法。
语法
aggregate()方法的基本语法如下
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
示例
假设在集合中,有以下数据
db.article.insert([
{
_id: 100,
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'Maxsu',
url: 'http://www.yiibai.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: 101,
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'Maxsu',
url: 'http://www.yiibai.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: 102,
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Kuber',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
{
_id: 103,
title: 'MySQL Overview',
description: 'MySQL is sql database',
by_user: 'Curry',
url: 'http://www.yiibai.com/mysql/',
tags: ['MySQL', 'database', 'SQL'],
likes: 350
}])Shell
现在从上面的集合中,如果要显示一个列表,说明每个用户写入了多少个教程,那么可使用以下aggregate()方法 -
> db.article.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "Curry", "num_tutorial" : 1 }
{ "_id" : "Kuber", "num_tutorial" : 1 }
{ "_id" : "Maxsu", "num_tutorial" : 2 }
Shell
对于上述用例的Sql等效查询是:
select by_user, count(*) as num_tutorial from `article` group by by_user
在上面的例子中,我们按字段by_user分组了文档,并且每次发生的by_user的前一个值的值都被递增。以下是可用聚合表达式的列表。
表达式
描述
示例
$sum
从集合中的所有文档中求出定义的值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg
计算集合中所有文档的所有给定值的平均值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min
从集合中的所有文档获取相应值的最小值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max
从集合中的所有文档获取相应值的最大值。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push
将值插入到生成的文档中的数组中。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet
将值插入生成的文档中的数组,但不会创建重复项。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first
根据分组从源文档获取第一个文档。 通常情况下,这只适用于以前应用的“$sort”阶段。
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last
根据分组从源文档获取最后一个文档。通常情况下,这只适用于以前应用的“$sort”阶段。
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
复制是跨多个服务器同步数据的过程。复制提供冗余,并通过不同数据库服务器上的多个数据副本增加数据可用性。 复制保护数据库免受单个服务器的丢失。 复制还允许从硬件故障和服务中断中恢复。 使用其他数据副本,可以将其专用于灾难恢复,报告或备份。
为什么复制?
MongoDB复制的工作原理
MongoDB通过使用副本集来实现复制。副本集是托管相同数据集的一组 mongod 实例。 在一个副本中,一个节点是接收所有写操作的主节点。所有其他实例(例如辅助节点)都应用主节点的操作,以便它们具有相同的数据集。 副本集可以只有一个主节点。
* 副本集是一组两个或多个节点(通常最少需要3
个节点)。
在副本集中,一个节点是主节点,其余节点是次要节点。
所有数据从主节点复制到辅助节点。
在自动故障切换或维护时,选择为主节点建立,并选择新的主节点。
恢复故障节点后,它再次加入副本集,并作为辅助节点。
显示了MongoDB复制的典型图,客户端应用程序始终与主节点进行交互,然后主节点将数据复制到辅助节点。
副本集功能
设置副本集
在本教程中,我们将独立的 MongoDB 实例转换为副本集。要转换为副本集,以下是步骤 -
示例
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
将会员添加到副本集
要将成员添加到副本集,请在多台计算机上启动 mongod 实例。 现在启动一个 mongo 客户端并发出一个命令rs.add()。
语法
rs.add()命令的基本语法如下:
>rs.add(HOST_NAME:PORT)
示例
假设您的 mongod 实例名称是 mongod1.net,它在端口 27017 上运行。要将此实例添加到副本集,请在 Mongo 客户端中发出命令 rs.add()。
>rs.add("mongod1.net:27017")
只能在连接到主节点时,将 mongod 实例添加到副本集。要检查是否连接到主服务器,请在 mongo 客户端中发出命令db.isMaster()。
rs0:PRIMARY> db.isMaster()
{
"hosts" : [
"ubuntu:27017"
],
"setName" : "rs0",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "ubuntu:27017",
"me" : "ubuntu:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1498896581, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2017-07-01T08:09:41Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2017-07-01T08:09:50.365Z"),
"maxWireVersion" : 5,
"minWireVersion" : 0,
"readOnly" : false,
"ok" : 1
}
rs0:PRIMARY>
语法
描述
示例
mongodump —host HOST_NAME —port PORT_NUMBER
此命令将备份指定的 mongod 实例的所有数据库。
mongodump --host 127.0.0.1 --port 27017
mongodump —out BACKUP_DIRECTORY
此命令将仅在指定路径上备份数据库。
mongodump --out /home/yiibai/mongobak
mongodump —collection COLLECTION —db DB_NAME
此命令将仅备份指定数据库的指定集合。
mongodump --collection mycol --db test
MongoDB采用基于角色的访问控制(RBAC)来确定用户的访问。 授予用户一个或多个角色,确定用户对MongoDB资源的访问权限和用户可以执行哪些操作。 用户应该只有最小权限集才能确保最小权限的系统。
MongoDB系统的每个应用程序和用户都应该映射到不同的用户。 这种访问隔离便于访问撤销和持续的用户维护。
如果启用了部署的访问控制,则可以使用localhost异常来创建系统中的第一个用户。 此第一个用户必须具有创建其他用户的权限。 对于MongoDB 3.0,使用localhost异常只能在admin
数据库上创建用户。 创建第一个用户后,必须使用该用户进行身份验证以添加后续用户。 启用Auth提供有关在启用部署访问控制时添加用户的更多详细信息。
对于常规用户创建,必须拥有以下权限:
要在数据库中创建新用户,必须在该数据库资源上具有createUser操作。
要向用户授予角色,必须对角色的数据库执行grantRole
操作。
userAdmin和userAdminAnyDatabase内置角色在其各自的资源上提供createUser
和grantRole
操作。
要在MongoDB部署中创建用户,请连接到部署,然后使用db.createUser()方法或createUser命令添加用户。
MongoDB是一个nosql数据库服务器。 默认安装提供使用mongo命令通过命令行访问数据库而不进行身份验证。下面我们来学习如何在具有适当身份验证的Mongodb服务器中创建用户。
创建管理员用户
可以使用以下命令在MongoDB服务器中创建具有管理员权限的用户。
$ mongo
use admin
db.createUser(
{
user:"root",
pwd:"huawei",
roles:[{role:"root",db:"admin"}]
}
)
exit
添加数据库用户
您还可以创建指定数据库的用户,该用户只能访问该数据库。也可以为此数据库上的用户指定访问级别。 例如,创建一个在mydb数据库上具有读写访问权限的用户帐户。
> use mydb
db.createUser(
{
user: "user01",
pwd: "pwd123",
roles: ["readWrite"]
}
)
exit
验证身份验证使用以下命令。 返回结果为1,表示认证成功。
> db.auth('user01','pwd123')
1
删除数据库用户
也可以使用以下命令从数据库中删除用户。
> use mydb
db.dropUser('user01)
创建带角色的用户
以下操作在test数据库中创建用户:mynewuser,并向用户提供readWrite和dbAdmin角色。
Shell use test
db.createUser(
{
user: "mynewuser",
pwd: "myuser123",
roles: [ "readWrite", "dbAdmin" ]
}
);
创建没有角色的用户
以下操作在test数据库中创建一个名为mynewuser1的用户,但尚未分配角色:
use test
db.createUser(
{
user: "mynewuser1",
pwd: "myuser1123",
roles: [ ]
}
);
创建具有角色的管理用户
以下操作在管理数据库中创建一个名为 myadmin1 的用户,并给予用户对config数据库的 readWrite访问权限,这样可以让用户更改分片分区的某些设置,例如平衡器设置。
use admin
db.createUser(
{
user: "myadmin1",
pwd: "myadmin123",
roles:
[
{ role: "readWrite", db: "config" },
"clusterAdmin"
]
}
);
本章基本用不上,因为有很多角色了,但是这里还是提一笔
创建用户定义的角色
角色授权用户访问MongoDB资源。 MongoDB提供了许多内置的角色,管理员可以使用它们来控制对MongoDB系统的访问。 但是,如果这些角色无法描述所需的权限集,则可以在特定数据库中创建新角色。
除了在管理数据库中创建的角色外,角色只能包含适用于其数据库的权限,并且只能继承其数据库中的其他角色。
在管理数据库中创建的角色可以包括适用于管理数据库,其他数据库或群集资源的权限,并且可以从其他数据库中的角色以及管理数据库继承。
要创建新角色,可使用db.createRole()方法,指定permissions数组中的权限和roles数组中的继承角色。
MongoDB使用数据库名称和角色名称的组合来唯一定义角色。 每个角色的范围限定在创建角色的数据库中,但MongoDB将所有角色信息存储在admin数据库的admin.system.roles集合中。
先决条件
要在数据库中创建角色,您必须具有:
* 对该数据库资源的createRole操作。
对该数据库的grantRole操作指定新角色的权限以及指定要继承的角色。
内置角色userAdmin和userAdminAnyDatabase在其各自的资源上提供createRole和grantRole操作。
创建角色来管理当前操作
以下示例创建一个名为manageOpRole的角色,该角色仅提供运行db.currentOp()和db.killOp()的权限。
第一步:使用相应的权限连接到MongoDB
使用“先决条件”部分指定的权限连接到 mongod 或 mongos 。
以下过程使用在“启用认证”中创建的用户:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
myUserAdmin具有在管理员以及其他数据库中创建角色的权限。
第二步:创建一个新角色来管理当前操作
manageOpRole具有对多个数据库以及群集资源的权限。 因此,您必须在管理数据库中创建该角色。
use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)
新角色授予杀死/终止任何操作的权限。
警告: 终止运行操作非常小心。只能使用db.killOp()方法或killOp命令终止客户端发起的操作,并且不会终止内部数据库操作
以下示例创建一个名为mongostatRole
的角色,该角色仅提供运行mongostat
的权限。
第一步:使用相应的权限连接到MongoDB
使用“先决条件”部分指定的权限连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
myUserAdmin
具有在管理员以及其他数据库中创建角色的权限。
第二步:创建一个新角色来管理当前的操作
mongostatRole
具有作用于群集资源的权限。 因此,您必须在管理数据库中创建该角色。
use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)
先决条件
grantRole
操作才能在该数据库上授予角色。revokeRole
操作以撤销该数据库上的角色。viewRole
操作。执行步骤
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:识别用户的角色和权限
要显示要修改的用户的角色和权限,请使用db.getUser()
和db.getRole()
方法。
例如,要查看在示例中创建的 reportsUser
的角色,执行以下命令:
use reporting
db.getUser("reportsUser")
要显示在 “accounts
” 数据库上由 readWrite
角色授予用户的权限,请执行以下操作:
use accounts
db.getRole( "readWrite", { showPrivileges: true } )
第三步:确定授予或撤销的权限
如果用户需要额外的权限,则向用户授予具有所需权限集的角色或角色。 如果此类角色不存在,请使用适当的权限集创建新角色。
撤销由现有角色提供的特权子集:撤销原始角色并授予仅包含所需权限的角色。如果角色不存在,您需要创建新角色。
第四步:修改用户的访问权限
撤销角色
使用db.revokeRolesFromUser()
方法撤销角色。以下示例操作从account
数据库上删除用户reportsUser
的 readWrite
角色:
use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)
授予角色
使用db.grantRolesToUser()
方法授予角色。 例如,以下操作授予reportsUser
用户account
数据库上的读取角色:
use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)
对于分片集群,用户的更改将在命令运行的 mongos
上即时生效。但是,对于群集中的其他mongos 实例,用户缓存可能会等待10
分钟才能刷新。请参阅userCacheInvalidationIntervalSecs。
先决条件
要修改数据库上另一个用户的密码,您必须对该数据库具有changeAnyPassword
操作。
操作步骤:
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:更改密码
将用户的用户名和新密码传递给db.changeUserPassword()方法。
以下操作将reporting用户的密码更改为:SOh3TbYhxuLiW8ypJPxmt1oOfL:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
先决条件
要查看其他用户的信息,您必须对其他用户的数据库具有viewUser
操作。
用户可以查看自己的信息。
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:查看用户的角色
使用usersInfo
命令或db.getUser()
方法显示用户信息。
例如,要查看在示例中创建的 reportsUser
的角色,请发出:
use reporting
db.getUser("reportsUser") #此方式,3.X以后才有
在返回的文档中,roles
字段显示reportsUser
的所有角色:
…
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]
先决条件
要查看角色的信息,您必须明确授予该角色,或必须对该角色的数据库具有 viewRole
操作。
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:查看角色授予的权限
对于给定的角色,请使用db.getRole()
方法或rolesInfo
命令与showPrivileges
选项一起执行:
例如,要查看在product
数据库上由读取角色授予的权限,请使用以下操作,问题如下:
use products
db.getRole( "read", { showPrivileges: true } )
在返回的文档中,有两个数组:privileges
和inheritedPrivileges
。权限列出了角色指定的权限,并排除了从其他角色继承的权限。 inheritedPrivileges
列出了由此角色授予的所有权限,这两个角色都是直接指定的并被继承。 如果该角色不能从其他角色继承,则两个字段是相同的。
…
"privileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
],
"inheritedPrivileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
]
手机扫一扫
移动阅读更方便
你可能感兴趣的文章