第1章 MongoDB的基本操作
1.1 查询帮助信息
> help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default use <db_name> set current database db.foo.find() list objects in collection foo db.foo.find( { a : 1 } ) list objects in foo where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell
# 或 KEYWORDS.help() # 或 KEYWORDS.[TAB]
- 说明:
- db:和数据库管理操作有关的
- rs:和replication set 复制集有关的命令
- sh:和shard分片有关的命令
1.2 常用操作
1.2.1 查看当前db版本
> db.version() 3.2.8
1.2.2 显示当前数据库
> db test # 或 > db.getName() test
1.2.3 查询所有数据库
> show dbs local 0.000GB > show databases local 0.000GB
1.2.4 切换到admin数据库
> use admin switched to db admin
1.2.5 显示当前数据库状态
> db.stats() { "db" : "admin", "collections" : 0, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 0, "numExtents" : 0, "indexes" : 0, "indexSize" : 0, "fileSize" : 0, "ok" : 1 }
1.2.6 查看当前数据库的连接机器地址
> db.getMongo() connection to 127.0.0.1
1.3 数据库操作
1.3.1 指定数据库进行连接(默认连接本机test数据库):
[[email protected] ~]$ mongo 127.0.0.1/admin MongoDB shell version: 3.2.8 connecting to: 127.0.0.1/admin > db admin
1.3.2 创建数据库
提示:当use的时候,系统就会自动创建一个数据库;如果use之后没有创建任何集合,系统就会删除这个数据库。
1.3.3 删除数据库
提示:如果没有选择任何数据库,会删除默认的test数据库。
> use test switched to db test > db.dropDatabase() { "ok" : 1 }
1.4 集合操作
1.4.1 创建集合
1.4.1.1 直接创建集合:
> db.createCollection('a') { "ok" : 1 } > db.createCollection('b') { "ok" : 1 }
1.4.1.2 当插入一个文档的时候,一个集合就会自动创建:
> db.c.insert({username:"mongodb"}) WriteResult({ "nInserted" : 1 })
1.4.2 查看当前数据下的所有集合
> show collections a b c # 或 > db.getCollectionNames() [ "a", "b", "c" ] # 或 > show tables a b c
1.4.3 查看集合内容
> db.c.find() { "_id" : ObjectId("5a1e4905dbb63d0ef5fe1f0e"), "username" : "mongodb" } > db.a.find().pretty() # 以格式化的方式显示信息 { "_id" : ObjectId("5a1e60e5dbb63d0ef5fe1f74"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2017-11-29T07:25:25.813Z") } { "_id" : ObjectId("5a1e60e5dbb63d0ef5fe1f75"), "uid" : 2, "name" : "mongodb", "age" : 6, "date" : ISODate("2017-11-29T07:25:25.813Z") }
1.4.4 重命名集合
> db.a.renameCollection("a1") { "ok" : 1 } > show collections a1 b c
1.4.5 删除集合
> use app switched to db app > db.a1.drop() true > show collections b c
1.5 数据操作
1.5.1 插入数据
> for(i=0;i<100;i++){db.a.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()});} WriteResult({ "nInserted" : 1 })
1.5.2 查询集合中的记录数
1.5.2.1 查询所有记录:
> db.a.find() { "_id" : ObjectId("5a1e4cd0dbb63d0ef5fe1f0f"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2017-11-29T05:59:44.245Z") } ...省略部分输出内容...
提示:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
- 设置每页显示数据的大小:
> DBQuery.shellBatchSize=50 # 设置每页显示50条记录 50
1.5.2.2 查询第一条记录:
> db.a.findOne() { "_id" : ObjectId("5a1e4cd0dbb63d0ef5fe1f0f"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2017-11-29T05:59:44.245Z") }
1.5.2.3 查询指定记录
> db.a.find({uid:50}) { "_id" : ObjectId("5a1e60e5dbb63d0ef5fe1fa5"), "uid" : 50, "name" : "mongodb", "age" : 6, "date" : ISODate("2017-11-29T07:25:25.843Z") }
1.5.2.4 查询总的记录数:
> db.a.count() 100
1.5.3 删除集合中的记录数
1.5.3.1 删除指定记录
> db.a.remove({uid:0}) WriteResult({ "nRemoved" : 1 }) > db.a.findOne() { "_id" : ObjectId("5a1e60e5dbb63d0ef5fe1f74"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2017-11-29T07:25:25.813Z") }
1.5.3.2 删除全部记录
> db.a.remove({}) WriteResult({ "nRemoved" : 100 }) > db.a.count() 0
1.6 查看集合存储信息
1.6.1 查看集合存储信息
> db.a.stats() { "ns" : "app.a", "count" : 0, "size" : 0, "storageSize" : 20480, "capped" : false, "wiredTiger" : { ...省略部分输出内容...
1.6.2 查看集合中数据的原始大小
> db.a.dataSize() 0
1.6.3 查看集合中索引数据的原始大小
> db.a.totalIndexSize() 20480
1.6.4 查看集合中索引+数据压缩存储之后的大小
> db.a.totalSize() 40960
1.6.5 查看集合中数据压缩存储的大小
> db.a.storageSize() 20480
第2章 使用客户端工具
NoSQL Manager for MongoDB是一款类似于SQL Server Management Studio的数据库管理软件。
下载地址:https://www.mongodbmanager.com/
第3章 用户管理
MongoDB数据库默认是没有用户名及密码的,即无权限访问限制,为了方便数据库的管理和安全,需要创建数据库用户。
3.1 创建用户
3.1.1 用户创建语法
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
- 语法说明:
- user字段:用户的名字
- pwd字段:用户的密码
- cusomData字段:为任意内容,例如可以为用户全名介绍
- roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;roles 字段可以指定内置角色和用户定义的角色。
提示:常用角色说明见官方文档:https://docs.mongodb.com/manual/reference/built-in-roles/
3.1.2 创建超级管理员(管理所有数据库)
> use admin switched to db admin > db.createUser( { user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ] } ) Successfully added user: { "user" : "root", "roles" : [ { "role" : "root", "db" : "admin" } ] }
3.1.3 验证用户
> db.auth("root","root") 1
3.1.4 登录用户
[[email protected] ~]$ mongo -uroot -proot admin MongoDB shell version: 3.2.8 connecting to: admin Server has startup warnings: > show tables system.users system.version
提示:如果不加用户名和密码及数据库名虽然也可以登录进数据库,但是无法访问其中的数据。
[[email protected] ~]$ mongo admin # 不加用户名和密码无法访问数据 MongoDB shell version: 3.2.8 connecting to: admin > show tables 2017-11-29T16:16:03.347+0800 E QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not authorized on admin to execute command { listCollections: 1.0, filter: {} }", "code" : 13 } : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/db.js:773:1 [email protected]/mongo/shell/db.js:785:19 [email protected]/mongo/shell/db.js:796:16 [email protected]/mongo/shell/utils.js:754:9 [email protected]/mongo/shell/utils.js:651:15 @(shellhelp2):1:1
3.2 按生产需求创建应用用户
3.2.1 创建对某库的只读用户
[[email protected] ~]$ mongo -uroot -proot admin > use test switched to db test > db.createUser( { user: "read", pwd: "read", roles: [ { role: "read", db: "test" } ] } ) Successfully added user: { "user" : "read", "roles" : [ { "role" : "read", "db" : "test" } ] } > db.auth("read","read") 1 # 重新登录测试结果 [[email protected] ~]$ mongo -uread -pread test # 以只读用户登录 > show tables # 进行查询操作(允许) a > db.a.insert({"uid":1,"name":"mongodb","age":6,"date":new Date()}) # 进行写入操作(报错) WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on test to execute command { insert: \"a\", documents: [ { _id: ObjectId('5a1e6ea7c550bef10cd42385'), uid: 1.0, name: \"mongodb\", age: 6.0, date: new Date(1511943847864) } ], ordered: true }" } })
3.2.2 创建某库的读写用户
[[email protected] ~]$ mongo -uroot -proot admin > use test switched to db test > db.createUser( { user: "readwrite", pwd: "readwrite", roles: [ { role: "readWrite", db: "test" } ] } ) Successfully added user: { "user" : "readwrite", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > db.auth("readwrite","readwrite") 1 # 重新登录测试结果 [[email protected] ~]$ mongo -ureadwrite -preadwrite test # 以读写用户登录 > show tables # 进行查询操作(允许) a > db.a.insert({"uid":1,"name":"mongodb","age":6,"date":new Date()}) # 进行写入操作(允许) WriteResult({ "nInserted" : 1 })
3.2.3 分别对多库的不同权限的用户
[[email protected] ~]$ mongo -uroot -proot admin > use test switched to db test > db.createUser( { user: "roles", pwd: "roles", roles: [{ role: "readWrite",db: "test"}, { role: "read", db: "app" } ] } ) Successfully added user: { "user" : "roles", "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "read", "db" : "app" } ] }
3.2.4 角色分类
3.2.4.1 数据库用户角色(Database User Roles)
read:授予User只读数据的权限 readWrite:授予User读写数据的权限
3.2.4.2 数据库管理角色(Database Administration Roles)
dbAdmin:在当前dB中执行管理操作 dbOwner:在当前DB中执行任意操作 userAdmin:在当前DB中管理User
3.2.4.3 备份和还原角色(Backup and Restoration Roles)
backup restore
3.2.4.4 跨库角色(All-Database Roles)
readAnyDatabase:授予在所有数据库上读取数据的权限 readWriteAnyDatabase:授予在所有数据库上读写数据的权限 userAdminAnyDatabase:授予在所有数据库上管理User的权限 dbAdminAnyDatabase:授予管理所有数据库的权限
3.2.4.5 集群管理角色(Cluster Administration Roles)
clusterAdmin:授予管理集群的最高权限 clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively. clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限 hostManager:管理Server
3.3 查看用户
3.3.1.1 查看所有用户
> use admin switched to db admin > db.system.users.find(); { "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "6i+6c//UG92hsGAKE+Va8Q==", "storedKey" : "Qbq83Dx36ZVKiEYY/rTKU3r9e/M=", "serverKey" : "Wd3krHtSvNDqf52yl5ThiJnPbis=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] } { "_id" : "test.read", "user" : "read", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "7Krbf82gklo9PPJP9PivIg==", "storedKey" : "LEJWdJfREYuaKij9JdLSAeNoaXY=", "serverKey" : "tqYpPiMlz6f0q7Nwcu7z2K6O/Mo=" } }, "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.readwrite", "user" : "readwrite", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "wj/mcQpF3szWftC5czfBnw==", "storedKey" : "gGJrtVSKWi6erHMUKpAghKjH7D0=", "serverKey" : "y8iWeEHmVGMwU+5VU0JEF9AIp/M=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" } ] }
3.3.1.2 查看某个库中的用户
> use test switched to db test > show users { "_id" : "test.read", "user" : "read", "db" : "test", "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.readwrite", "user" : "readwrite", "db" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ] }
3.4 删除用户
[[email protected] ~]$ mongo -uroot -proot admin > show users { "_id" : "test.test", "user" : "test", "db" : "test", "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.read", "user" : "read", "db" : "test", "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.readwrite", "user" : "readwrite", "db" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > db.dropUser("test") true

我的微信
如果有技术上的问题可以扫一扫我的微信