博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1. MongoDB登陆
阅读量:4048 次
发布时间:2019-05-25

本文共 9681 字,大约阅读时间需要 32 分钟。

1.mongo 远程连接

配置mongodb.conf,注释掉bind_ip

 #bind_ip = 127.0.0.1   //注释此行

 

启用认证登陆

auth = true       //将此行前的注释去掉

 

登陆(authenticationDatabase 验证数据库)

mongo host:port/dbname -u user-p password --authenticationDatabase dbname 

mongo 127.0.0.1:27017/admin -u root -p 123456 --authenticationDatabase admin

 

正确关闭mongod 的方法

use admin

db.shutdownServer()

 

 

用户操作

认证 

db.auth("user","password")

全部用户 

show users // db.system.users.find()  

// 新建用户

// 超级用户 root

db.createUser({user: "root",pwd: "123456",roles: [ "root" ]})

// 用户管理权限 userAdminAnyDatabase

db.createUser({user:"userAdmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

// 数据库管理权限 dbAdminAnyDatabase

db.createUser({user:"dbAdmin",pwd:"123456",roles:[{role:"dbAdminAnyDatabase",db:"admin"}]})

// 数据读写用户 readWriteAnyDatabase

use test

db.createUser({user:"sa",pwd:"sa",roles:[{role:"readWrite",db:"test"}]})

// 已废弃的方法 相当于新建 { "user" : "root", "roles" : [ "dbOwner" ] }

 

// db.addUser("root","123456") 

// 修改密码 db.changeUserPassword("root", "root")

// 删除原用户 db.dropUser("test") // db.system.users.remove({user:"test"});

 

角色权限

展示角色 show roles;

// 查看当前用户的权限 db.runCommand({usersInfo:"root",showPrivileges:true})

// 查看角色权限 db.getRole( "dbAdminAnyDatabase", { showPrivileges: true } )

 

 

集合(collection)文档(JSON)操作

展示集合 show collections;

查询数据 db.collection.find(query)  // query可以是 ObjectId("24length")

查询一条 db.collection.findOne(query)   // query可以是 ObjectId("24length")

插入数据 db.collection.insert(JSON)

删除数据 db.collection.remove(query)

更新数据 db.collection.update(queryjson,JSON[,{multi:true}]) // 及时匹配多条也只修改一条 ,可选项mulit:true时更新多条

删除集合 db.collection.drop()

添加或更新数据 db.collection.save(JSON) // JSON没有_id是insert否则是upsert

集合名的长度不能超过121字节,是因为集合命名空间中需要额外6个字节 .$_id_ ,放在一起是127个字节 

 

更新修改器

1.增加、修改、删除

$set 增加或修改建对应的值 

db.foo.update({"_id" : ObjectId("...")},{"$set":{"total":1,coll:[{"json1":"jsonV"},{"key":"value"}]}})

$unset  删除键对应的值

db.foo.update({"_id" : ObjectId("...")},{"$unset":{"total":null,coll:null}})

 

2.计数器

$inc  增加或减少数字 只能用于整数、长整数或双精度浮点数

db.foo.update({"_id":ObjectId("...")},{"$inc":{"total":-1}})

 

3.数组修改器

$push 新增或向尾部插入一个元素 一次只能插入一个

db.foo.update({"_id" : ObjectId("...")},{"$push":{coll:"a"}})

 

$ne 查询是否不存在某个元素 从查询的角度避免重复

db.foo.update({"_id" : ObjectId("..."),"coll":{"$ne":"a"}},{"$push":{coll:"a"}})

 

$addToSet 不设置重复值 从数组元素值的角度避免重复数据

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$addToSet":{coll:"c"}})

 

$each 将数组拆分,实现批量插入

可以跟$addToSet结合使用

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$addToSet":{coll:{"$each":["a","b","c","d"]}}})

 

$pop 栈的方式删除一端元素

负数从左移除一位,null/0/正数从右移除一位 

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$pop":{"coll":1}})

 

$pull 删除匹配元素

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$pull":{"coll":5}})

 

4.数组定位修改器 $

通过下标(0开始)或定位操作符$(有问题)

db.foo.update({"_id" : ObjectId("54c25d065478a3459336bab0")},{"$set":{"coll.0":{"k0":"v0"}}})

 

5.upsert

创建或更新文档 update第三个参数为true,表示这是个upsert,如果不存在,查询条件会被当做文档的一部分

db.foo.update({"a":"b"},{"$inc":{"total":1}},true)

 

6.update 第四个参数

代表更新所有匹配到的文档,默认只更新第一个匹配到的文档

db.foo.update({"a":"b"},{"$inc":{"total":1}},false,true)

 

7.返回更新状态  getLastError

主要对写操作有用,写操作默认不会有返结果:这样就节约了客户端在写操作时等待客户端/服务器之间往返时间

db.runCommand({getLastError:1}) // 等价于 db.getLastErrorObj() 不等价于db.getLastError() 

选项

fsync 当没有使用日志功能运行mongod(--nojournal)时,同步的选项强制数据库在同步完所有文件后才返回。 db.runCommand({getlasterror:1,fsync:true})

j:当j=true时,getlasterror调用等待日志提交后才返回。如果服务器没有启用日志功能,它立即返回,并且成功 db.runCommand({getlasterror:1,j:true})

w:客户端可以阻塞直到一个写操作被复制到N个服务器。wtimeout可以联合w一起使用。默认是没有超时(永久等待)db.getLastError(2, 5000) // w=2, timeout 5000ms

 

返回值

这个命令的返回值是一个多字段的对象。常用的字段已经列在下面;这里可能还有其他字段。

  • ok - 为真的话表示getLastError命令成功完成了。它并不表示上一次没有错误。
  • err - 如果非空,表示有错误出现。值是一个错误正文的描述。
  • code - 如果设置了,表示出现的错误码。
  • connectionId - 连接的id。
  • lastOp - 上一次操作的op-id

对于更新:

  • n - 如果一次更新完成了,它是更新的文档个数。

使用了w:<n>/<tag>

  • wnote - 如果设置了,表示这里有些不寻常的事情发生,涉及使用w:
  • wtimeout - 如果超时了,设置该值为真
  • waited - 如果超时了,标记等到了多久,单位毫秒
  • wtime - 花在等待操作完成的时间

 

JSON操作

赋值

foo.key1 = foo.key2

 

删除某个属性

delete foo.key

 

 

其他

展示状态 show dbs;

可以直接使用ObjectId("123456789012345678901234") 

 

0x00 MongoDB权限介绍


1.MongoDB安装时不添加任何参数,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库,需以--auth参数启动。

2.在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息。当admin.system.users一个用户都没有时,即使mongod启动时添加了--auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以--auth 参数启动),直到在admin.system.users中添加了一个用户。

3.MongoDB的访问分为连接和权限验证,即使以--auth参数启动还是可以不使用用户名连接数据库,但是不会有任何的权限进行任何操作

4.admin数据库中的用户名可以管理所有数据库,其他数据库中的用户只能管理其所在的数据库。

5.在2.4之前版本中,用户的权限分为只读和拥有所有权限;2.4版本的权限管理主要分为:数据库的操作权限、数据库用户的管理权限、集群的管理权限,建议由超级用户在admin数据库中管理这些用户。不过依然兼容2.4版本之前的用户管理方法。

 

0x01 MongoDB中用户的角色说明


1. read角色

数据库的只读权限,包括:

aggregate,checkShardingIndex,cloneCollectionAsCapped,collStats,count,dataSize,dbHash,dbStats,distinct,filemd5,mapReduce (inline output only.),text (beta feature.)geoNear,geoSearch,geoWalk,group

2. readWrite角色

数据库的读写权限,包括:

read角色的所有权限

cloneCollection (as the target database.),convertToCapped,create (and to create collections implicitly.),renameCollection (within the same database.)findAndModify,mapReduce (output to a collection.) drop(),dropIndexes,emptycapped,ensureIndex()

3. dbAdmin角色

数据库的管理权限,包括:

clean,collMod,collStats,compact,convertToCappe create,db.createCollection(),dbStats,drop(),dropIndexes ensureIndex(),indexStats,profile,reIndex renameCollection (within a single database.),validate

4. userAdmin角色

数据库的用户管理权限

5. clusterAdmin角色

集群管理权限(副本集、分片、主从等相关管理),包括:

addShard,closeAllDatabases,connPoolStats,connPoolSync,_cpuProfilerStart_cpuProfilerStop,cursorInfo,diagLogging,dropDatabase shardingState,shutdown,splitChunk,splitVector,split,top,touchresync serverStatus,setParameter,setShardVersion,shardCollection replSetMaintenance,replSetReconfig,replSetStepDown,replSetSyncFrom repairDatabase,replSetFreeze,replSetGetStatus,replSetInitiate logRotate,moveChunk,movePrimary,netstat,removeShard,unsetSharding hostInfo,db.currentOp(),db.killOp(),listDatabases,listShardsgetCmdLineOpts,getLog,getParameter,getShardMap,getShardVersion enableSharding,flushRouterConfig,fsync,db.fsyncUnlock()

6. readAnyDatabase角色

任何数据库的只读权限(和read相似)

7. readWriteAnyDatabase角色

任何数据库的读写权限(和readWrite相似)

8. userAdminAnyDatabase角色

任何数据库用户的管理权限(和userAdmin相似)

9. dbAdminAnyDatabase角色

任何数据库的管理权限(dbAdmin相似)

0x02 MongoDB安装注意事项


1. 安装的时候需要加--auth

加了--auth之后MongoDB才需要验证

2. 需要加--nohttpinterface

不加会有一个28017的端口监听,可以通过网页管理mongodb,不需要请去掉

3. 可以加--bind_ip

加之后可以限制访问的ip

4. 可以加--port

加了之后可以重新制定端口,默认为27017

5. 安装完之后需立即在admin数据库中添加一个用户

只有在admin数据库中添加一个用户后才能使认证生效

注:安装的过程其实就是添加1个服务,指定启动时候的参数。

0x03 用户授权


1. 2.4之前版本的用户管理方式

1.1、进入admin创建一个管理账号

use admin db.addUser("test","test")

1.2、进入需要使用的数据库中创建一个程序使用用户

use test db.addUser("test","test")默认拥有读写权限 db.addUser("test","test",True)拥有读取权限

2. 2.4版本的用户管理,也可使用之前版本的方式

2.1、进入admin创建一个管理账号

use admin db.addUser("test","test")

2.2、进入admin给使用的数据库test创建一个对数据库及日志拥有读写权限的账户

use admin db.addUser({    "user": "test",     "pwd": "test",     "roles": [ ],     "otherDBRoles": {        "test": [            "readWrite"        ],         "test_log": [            "readWrite"        ]    }})

0x04 安全配置方案


1. 安装的时候加--auth,并立即在admin数据库创建一个用户

默认情况下MongoDB是无需验证的,所以这是至关重要的一步

2. 可以考虑安装的时候修改端口和指定访问ip

具体根据实际情况来设定,也可以直接在服务器防火墙上做

3. 安装的时候建议加上--nohttpinterface取消默认的一个网页管理方式

默认的web管理一般不会用,且很多人不知道,最好关闭

4. 管理用户处理

因需要在admin中建立一个管理账户用于管理,最好是设置强密码,但是不要给其他程序使用

5. MongoDB服务运行账户

windows下可以使用network service 或者新建一个用户,使用默认的USERS组,然后添加给予数据库文件及日志存储目录的写权限,并建议取消对cmd等程序的执行权限。

linux下新建一个账户,给予程序的执行权限和数据库文件及日志目录的读写权限,并建议取消对sh等程序的执行权限。

6. 控制好网站或者其他程序使用的连接用户权限

网站或者其他程序使用的用户只给予对应库的权限,不要使用admin数据库中的管理账户。

0x05 常用命令


1. 安装

mongod --dbpath d:\mongodb\data --logpath d:\mongodb\log\mongodb.log ----nohttpinterface --auth --install

2. 添加用户

use admin db.addUser("test","test")

3. 显示所有数据库

show dbs

4. 使用某个数据库

use test

5. 连接数据库

mongo test -uroot -p123456

6. 添加用户认证

db.auth("username","password")

7. 查看用户

db.system.users.find()

就写几个基本的,其他的网上很多,或者用工具连上去之后操作。

0x06 管理工具


1. MongoVUE

客户端形式的管理工具

 

不受访问限制的超级用户

use admindb.createUser(    {
user: "superuser", pwd: "12345678", roles: [ "root" ] })

 

服务器配置: /etc/mongod.conf

 

# mongod.conf#where to loglogpath=/var/log/mongodb/mongod.log# 以追加方式写入日志logappend=true# fork and run in backgroundfork=true# 端口#port=27017# 数据库文件保存位置dbpath=/var/lib/mongo# location of pidfilepidfilepath=/var/run/mongodb/mongod.pid# Listen to local interface only. Comment out to listen on all interfaces. bind_ip=127.0.0.1# Disables write-ahead journaling# nojournal=true# Enables periodic logging of CPU utilization and I/O wait# 启用定期记录CPU利用率和 I/O 等待 #cpu=true# Turn on/off security.  Off is currently the default# 是否以安全认证方式运行,默认是不认证的非安全方式#noauth=true#auth=true# Verbose logging output.# 详细记录输出#verbose=true# Inspect all client data for validity on receipt (useful for# developing drivers)# 用于开发驱动程序时的检查客户端接收数据的有效性#objcheck=true# Enable db quota management# 启用数据库配额管理,默认每个db可以有8个文件,可以用quotaFiles参数设置 #quota=true# Set oplogging level where n is# 设置oplog记录等级#   0=off (default)#   1=W#   2=R#   3=both#   7=W+some reads#diaglog=0# Ignore query hints# 忽略查询提示#nohints=true# Enable the HTTP interface (Defaults to port 28017).# 禁用http界面,默认为localhost:28017#httpinterface=true# Turns off server-side scripting.  This will result in greatly limited# 关闭服务器端脚本,这将极大的限制功能# functionality#noscripting=true# Turns off table scans.  Any query that would do a table scan fails.# 关闭扫描表,任何查询将会是扫描失败 #notablescan=true# Disable data file preallocation.# 关闭数据文件预分配#noprealloc=true# Specify .ns file size for new databases.# 为新数据库指定.ns文件的大小,单位:MB# nssize=
# Replication Options# in replicated mongo databases, specify the replica set name here#replSet=setname# maximum size in megabytes for replication operation log#oplogSize=1024# path to a key file storing authentication info for connections# between replica set members#keyFile=/path/to/keyfile
 

 

 

转载地址:http://dqyci.baihongyu.com/

你可能感兴趣的文章
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>