Mongodb总结
简介
准备工作
安装Mongodb
windows版从官网下载安装文件一路OK即可
启动服务
连接服务
命令窗口执行 mongo host:port
或 mongo host:port/dbName
或 mongo host:port/dbName -u user -p pwd
即可
数据库操作
创建数据库
- 语法:
use DATABASE_NAME
,如果数据库不存在,则创建数据库,否则切换到指定数据库,show dbs
命令可查看所有数据库。几乎对数据库的所有操作都要先使用use dbName
来切换数据库后再进行操作
例:> use test switched to db test > db test > show dbs admin 0.000GB local 0.000GB test 0.000GB
删除数据库
- 语法:
db.dropDatabase()
,先使用use命令切换到待删除数据库后使用该命令可删除相应数据库。
例:> use test switched to db test > db test > db.dropDatabase() > show dbs admin 0.000GB local 0.000GB
创建集合
- 语法:
db.createCollection(name, options)
,在该命令中,name 是所要创建的集合名称。options 是一个用来指定集合配置的文档。 - show collections命令可以查看该数据库下所有的集合。
例:> use MyBlog switched to db MyBlog > db.createCollection('newcol') { "ok" : 1 } > show collections blog newcol users
删除集合
- 语法:
db.collectionName.drop()
,其中collectionName为所要删除的集合的名称
例:> db.newcol.drop() true > show collections blog users
查询文档
- 语法:
db.collectionName.find([param])[.pretty()]
,其中collectionName为要查询的集合名称,param为查询条件,如果不设置param,即db.collectionName.find()
用来查询出全部文档,而pertty()方法指返回格式化的数据。
例:>db.blog.find().pretty() /* 1 */ { "_id" : ObjectId("59e017c497c02061aee8288a"), "title" : "first blog", "content" : "this is content for first blog", "author" : "ever", "createTime" : ISODate("2017-10-13T01:32:52.861Z") } /* 2 */ { "_id" : ObjectId("59e0180197c02061aee8288b"), "title" : "second blog", "content" : "this is content for second blog", "author" : "john", "createTime" : ISODate("2017-10-13T01:33:53.297Z") }
- 查询条件设置:
操作 格式 范例 RDBMS中的类似语句 等于 {<key>:<value>}
db.mycol.find({"by":"tutorials point"}).pretty()
where by = 'tutorials point'
小于 {<key>:{$lt:<value>}}
db.mycol.find({"likes":{$lt:50}}).pretty()
where likes < 50
小于等于 {<key>:{$lte:<value>}}
db.mycol.find({"likes":{$lte:50}}).pretty()
where likes <= 50
大于 {<key>:{$gt:<value>}}
db.mycol.find({"likes":{$gt:50}}).pretty()
where likes > 50
大于等于 {<key>:{$gte:<value>}}
db.mycol.find({"likes":{$gte:50}}).pretty()
where likes >= 50
不等于 {<key>:{$ne:<value>}}
db.mycol.find({"likes":{$ne:50}}).pretty()
where likes != 50
> db.blog.find({"author":"ever"}).pretty()
- and条件设置:
在 find() 方法中,如果传入多个键,并用逗号(,)分隔它们,那么 MongoDB 会把它看成是 AND 条件。AND 条件的基本语法格式为:
db.collectionName.find({key1:value1, key2:value2}).pretty()
或
db.collectionName.find({$and:[{key1:value1},{key2:value2}]})
例:查询author为"ever"并且title为"second blog"的所有文档> db.blog.find({"author":"ever","title":"second blog"}) 或 > db.blog.find({$and:[{"author":"ever"},{"title":"second blog"}]})
- or条件设置:
语法:db.mycol.find({$or:[{key1: value1}, {key2:value2}]}).pretty()
,类似于and的语法
插入文档
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,
- 语法:
db.COLLECTION_NAME.insert(document)
,同样的要先使用use切换到相应数据库。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
例:> db.person.insert({"name":"ever","age":18}) Inserted 1 record(s) in 41ms > db.person.find() /* 1 */ { "_id" : ObjectId("59de30103a2fba4b96f0ccb9"), "name" : "ever", "age" : 18.0 }
更新文档
MongoDB 中的 update() 与 save() 方法都能用于更新集合中的文档。update() 方法更新已有文档中的值,而 save() 方法则是用传入该方法的文档来替换已有文档。
- save():传入新的完整的文档来覆盖现有文档,需要包含_id字段
例:>db.blog.save({"_id":"ObjectId(5983548781331adf45ec5)","title":"firstblog"})
- update():
db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
例:将author为"jack"并且title为"third blog"的文档的author字段更新为"ever"> db.blog.update({author:"jack",title:"third blog"},{$set:{author:"ever"}}) Updated 1 existing record(s) in 98ms
删除文档
- 语法:
db.COLLECTION_NAME.remove(DELLETION_CRITTERIA[,justone])
,其中justone参数为可选,表示是否只删除一条文档,1表示是,不赋值默认为否。(注:database和collection的删除都是用drop方法,并且无参数,文档删除用remove方法且有参数)。
例:新增一条文档,并删除之> db.blog.insert({title:"seventh blog",content:"this is content for seventh blog",author:"sophia",createTime:new Date()}) Inserted 1 record(s) in 86ms > db.blog.remove({author:"sophia",title:"seventh blog"}) Removed 1 record(s) in 87ms
权限管理
用户管理
以上所有操作都不需要用户认证,任何人都可以连接并操作数据库,显然是很不安全的,需要为数据库添加用户并进行用户权限控制,基本操作步骤:创建管理员账号->登录管理员账号->创建普通用户->登录普通用户。具体如下:
- 创建管理员账号:
MongoDB初始是没有管理员或默认账号的,需要自行添加,过程如下:- 连接服务器:mongo host/port/db
> mongo localhost:27017 MongoDB shell version v3.4.9 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.9
- 切换到admin库(因为所有用户信息保存在admin库)并使用
db.createUser
方法创建管理员账号:> use admin switched to db admin > db.createUser( { user: "admin", pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } > show users { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
- 开启权限认证
在 c:\data\db\conf\mongodb.conf 配置文件中添加一行:auth=true
即可开启权限认证,重新连接数据库测试,如下提示没有认证则表示开启认证成功> show dbs 2017-10-16T10:01:22.637+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13, "codeName" : "Unauthorized" } :
- 连接服务器:mongo host/port/db
- 登录管理员账户:
切换到admin数据库并使用db.auth(user,pwd)
方法登录,返回1表示登录成功> db.auth('admin','123456') 1
- 创建普通用户:
切换到待创建普通用户的数据库并使用db.createUser
方法创建普通账号:> db.createUser({user:"rascalquan",pwd:"123456",roles:[{role:"readWrite", db: "mydb"}]})
- 登录普通用户:
使用db.auth(user,pwd)
登录数据库> db.auth('rascalquan','123456') 1
至此,可以使用rascalquan账号操作mydb数据库了。
修改用户密码
- 语法:db.changeUserPassword('user','newPwd');
角色管理
MongoDB内置以下角色:
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
网友评论