Mongodb總結(jié)
簡介
準(zhǔn)備工作
安裝Mongodb
windows版從官網(wǎng)下載安裝文件一路OK即可
啟動服務(wù)
連接服務(wù)
命令窗口執(zhí)行 mongo host:port
或 mongo host:port/dbName
或 mongo host:port/dbName -u user -p pwd
即可
數(shù)據(jù)庫操作
創(chuàng)建數(shù)據(jù)庫
- 語法:
use DATABASE_NAME
涩赢,如果數(shù)據(jù)庫不存在湃窍,則創(chuàng)建數(shù)據(jù)庫,否則切換到指定數(shù)據(jù)庫,show dbs
命令可查看所有數(shù)據(jù)庫。幾乎對數(shù)據(jù)庫的所有操作都要先使用use dbName
來切換數(shù)據(jù)庫后再進(jìn)行操作
例:> use test switched to db test > db test > show dbs admin 0.000GB local 0.000GB test 0.000GB
刪除數(shù)據(jù)庫
- 語法:
db.dropDatabase()
和泌,先使用use命令切換到待刪除數(shù)據(jù)庫后使用該命令可刪除相應(yīng)數(shù)據(jù)庫。
例:> use test switched to db test > db test > db.dropDatabase() > show dbs admin 0.000GB local 0.000GB
創(chuàng)建集合
- 語法:
db.createCollection(name, options)
愁拭,在該命令中褪贵,name 是所要創(chuàng)建的集合名稱。options 是一個(gè)用來指定集合配置的文檔怒医。 - show collections命令可以查看該數(shù)據(jù)庫下所有的集合炉抒。
例:> 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為查詢條件稚叹,如果不設(shè)置param端礼,即db.collectionName.find()
用來查詢出全部文檔,而pertty()方法指返回格式化的數(shù)據(jù)入录。
例:>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") }
- 查詢條件設(shè)置:
操作 格式 范例 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條件設(shè)置:
在 find() 方法中蛤奥,如果傳入多個(gè)鍵,并用逗號(,)分隔它們僚稿,那么 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條件設(shè)置:
語法:db.mycol.find({$or:[{key1: value1}, {key2:value2}]}).pretty()
,類似于and的語法
插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,
- 語法:
db.COLLECTION_NAME.insert(document)
蚀同,同樣的要先使用use切換到相應(yīng)數(shù)據(jù)庫缅刽。如果不指定 _id 字段 save() 方法類似于 insert() 方法啊掏。如果指定 _id 字段,則會更新該 _id 的數(shù)據(jù)衰猛。
例:> 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():傳入新的完整的文檔來覆蓋現(xiàn)有文檔娜睛,需要包含_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參數(shù)為可選卦睹,表示是否只刪除一條文檔畦戒,1表示是,不賦值默認(rèn)為否结序。(注:database和collection的刪除都是用drop方法障斋,并且無參數(shù),文檔刪除用remove方法且有參數(shù))徐鹤。
例:新增一條文檔垃环,并刪除之> 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
權(quán)限管理
用戶管理
以上所有操作都不需要用戶認(rèn)證,任何人都可以連接并操作數(shù)據(jù)庫返敬,顯然是很不安全的晴裹,需要為數(shù)據(jù)庫添加用戶并進(jìn)行用戶權(quán)限控制,基本操作步驟:創(chuàng)建管理員賬號->登錄管理員賬號->創(chuàng)建普通用戶->登錄普通用戶救赐。具體如下:
- 創(chuàng)建管理員賬號:
MongoDB初始是沒有管理員或默認(rèn)賬號的涧团,需要自行添加,過程如下:- 連接服務(wù)器: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庫(因?yàn)樗杏脩粜畔⒈4嬖赼dmin庫)并使用
db.createUser
方法創(chuàng)建管理員賬號:> 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" } ] }
- 開啟權(quán)限認(rèn)證
在 c:\data\db\conf\mongodb.conf 配置文件中添加一行:auth=true
即可開啟權(quán)限認(rèn)證经磅,重新連接數(shù)據(jù)庫測試泌绣,如下提示沒有認(rèn)證則表示開啟認(rèn)證成功> 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" } :
- 連接服務(wù)器:mongo host/port/db
- 登錄管理員賬戶:
切換到admin數(shù)據(jù)庫并使用db.auth(user,pwd)
方法登錄,返回1表示登錄成功> db.auth('admin','123456') 1
- 創(chuàng)建普通用戶:
切換到待創(chuàng)建普通用戶的數(shù)據(jù)庫并使用db.createUser
方法創(chuàng)建普通賬號:> db.createUser({user:"rascalquan",pwd:"123456",roles:[{role:"readWrite", db: "mydb"}]})
- 登錄普通用戶:
使用db.auth(user,pwd)
登錄數(shù)據(jù)庫> db.auth('rascalquan','123456') 1
至此预厌,可以使用rascalquan賬號操作mydb數(shù)據(jù)庫了阿迈。
修改用戶密碼
- 語法:db.changeUserPassword('user','newPwd');
角色管理
MongoDB內(nèi)置以下角色:
- Read:允許用戶讀取指定數(shù)據(jù)庫
- readWrite:允許用戶讀寫指定數(shù)據(jù)庫
- dbAdmin:允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建轧叽、刪除苗沧,查看統(tǒng)計(jì)或訪問system.profile
- userAdmin:允許用戶向system.users集合寫入,可以找指定數(shù)據(jù)庫里創(chuàng)建炭晒、刪除和管理用戶
- clusterAdmin:只在admin數(shù)據(jù)庫中可用待逞,賦予用戶所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限。
- readAnyDatabase:只在admin數(shù)據(jù)庫中可用网严,賦予用戶所有數(shù)據(jù)庫的讀權(quán)限
- readWriteAnyDatabase:只在admin數(shù)據(jù)庫中可用识樱,賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限
- userAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限
- dbAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的dbAdmin權(quán)限怜庸。
- root:只在admin數(shù)據(jù)庫中可用当犯。超級賬號,超級權(quán)限