Mongodb總結(jié)
簡(jiǎn)介
準(zhǔn)備工作
安裝Mongodb
windows版從官網(wǎng)下載安裝文件一路OK即可
啟動(dòng)服務(wù)
連接服務(wù)
命令窗口執(zhí)行 mongo host:port 或 mongo host:port/dbName 或 mongo host:port/dbName -u user -p pwd 即可
數(shù)據(jù)庫(kù)操作
創(chuàng)建數(shù)據(jù)庫(kù)
- 語(yǔ)法:
use DATABASE_NAME,如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù),show dbs命令可查看所有數(shù)據(jù)庫(kù)。幾乎對(duì)數(shù)據(jù)庫(kù)的所有操作都要先使用use dbName來(lái)切換數(shù)據(jù)庫(kù)后再進(jìn)行操作
例:> use test switched to db test > db test > show dbs admin 0.000GB local 0.000GB test 0.000GB
刪除數(shù)據(jù)庫(kù)
- 語(yǔ)法:
db.dropDatabase(),先使用use命令切換到待刪除數(shù)據(jù)庫(kù)后使用該命令可刪除相應(yīng)數(shù)據(jù)庫(kù)。
例:> use test switched to db test > db test > db.dropDatabase() > show dbs admin 0.000GB local 0.000GB
創(chuàng)建集合
- 語(yǔ)法:
db.createCollection(name, options),在該命令中,name 是所要?jiǎng)?chuàng)建的集合名稱(chēng)。options 是一個(gè)用來(lái)指定集合配置的文檔。 - show collections命令可以查看該數(shù)據(jù)庫(kù)下所有的集合。
例:> use MyBlog switched to db MyBlog > db.createCollection('newcol') { "ok" : 1 } > show collections blog newcol users
刪除集合
- 語(yǔ)法:
db.collectionName.drop(),其中collectionName為所要?jiǎng)h除的集合的名稱(chēng)
例:> db.newcol.drop() true > show collections blog users
查詢(xún)文檔
- 語(yǔ)法:
db.collectionName.find([param])[.pretty()],其中collectionName為要查詢(xún)的集合名稱(chēng),param為查詢(xún)條件,如果不設(shè)置param,即db.collectionName.find()用來(lái)查詢(xún)出全部文檔,而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") } - 查詢(xún)條件設(shè)置:
例:只查詢(xún)author為ever的文檔操作 格式 范例 RDBMS中的類(lèi)似語(yǔ)句 等于 {<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è)鍵,并用逗號(hào)(,)分隔它們,那么 MongoDB 會(huì)把它看成是 AND 條件。AND 條件的基本語(yǔ)法格式為:
db.collectionName.find({key1:value1, key2:value2}).pretty()
或
db.collectionName.find({$and:[{key1:value1},{key2:value2}]})
例:查詢(xún)author為"ever"并且title為"second blog"的所有文檔> db.blog.find({"author":"ever","title":"second blog"}) 或 > db.blog.find({$and:[{"author":"ever"},{"title":"second blog"}]}) - or條件設(shè)置:
語(yǔ)法:db.mycol.find({$or:[{key1: value1}, {key2:value2}]}).pretty(),類(lèi)似于and的語(yǔ)法
插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,
- 語(yǔ)法:
db.COLLECTION_NAME.insert(document),同樣的要先使用use切換到相應(yīng)數(shù)據(jù)庫(kù)。如果不指定 _id 字段 save() 方法類(lèi)似于 insert() 方法。如果指定 _id 字段,則會(huì)更新該 _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() 方法則是用傳入該方法的文檔來(lái)替換已有文檔。
- save():傳入新的完整的文檔來(lái)覆蓋現(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
刪除文檔
- 語(yǔ)法:
db.COLLECTION_NAME.remove(DELLETION_CRITTERIA[,justone]),其中justone參數(shù)為可選,表示是否只刪除一條文檔,1表示是,不賦值默認(rèn)為否。(注:database和collection的刪除都是用drop方法,并且無(wú)參數(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)限管理
用戶(hù)管理
以上所有操作都不需要用戶(hù)認(rèn)證,任何人都可以連接并操作數(shù)據(jù)庫(kù),顯然是很不安全的,需要為數(shù)據(jù)庫(kù)添加用戶(hù)并進(jìn)行用戶(hù)權(quán)限控制,基本操作步驟:創(chuàng)建管理員賬號(hào)->登錄管理員賬號(hào)->創(chuàng)建普通用戶(hù)->登錄普通用戶(hù)。具體如下:
- 創(chuàng)建管理員賬號(hào):
MongoDB初始是沒(méi)有管理員或默認(rèn)賬號(hào)的,需要自行添加,過(guò)程如下:- 連接服務(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庫(kù)(因?yàn)樗杏脩?hù)信息保存在admin庫(kù))并使用
db.createUser方法創(chuàng)建管理員賬號(hào):> 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" } ] } - 開(kāi)啟權(quán)限認(rèn)證
在 c:\data\db\conf\mongodb.conf 配置文件中添加一行:auth=true即可開(kāi)啟權(quán)限認(rèn)證,重新連接數(shù)據(jù)庫(kù)測(cè)試,如下提示沒(méi)有認(rèn)證則表示開(kāi)啟認(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
- 登錄管理員賬戶(hù):
切換到admin數(shù)據(jù)庫(kù)并使用db.auth(user,pwd)方法登錄,返回1表示登錄成功> db.auth('admin','123456') 1 - 創(chuàng)建普通用戶(hù):
切換到待創(chuàng)建普通用戶(hù)的數(shù)據(jù)庫(kù)并使用db.createUser方法創(chuàng)建普通賬號(hào):> db.createUser({user:"rascalquan",pwd:"123456",roles:[{role:"readWrite", db: "mydb"}]}) - 登錄普通用戶(hù):
使用db.auth(user,pwd)登錄數(shù)據(jù)庫(kù)> db.auth('rascalquan','123456') 1
至此,可以使用rascalquan賬號(hào)操作mydb數(shù)據(jù)庫(kù)了。
修改用戶(hù)密碼
- 語(yǔ)法:db.changeUserPassword('user','newPwd');
角色管理
MongoDB內(nèi)置以下角色:
- Read:允許用戶(hù)讀取指定數(shù)據(jù)庫(kù)
- readWrite:允許用戶(hù)讀寫(xiě)指定數(shù)據(jù)庫(kù)
- dbAdmin:允許用戶(hù)在指定數(shù)據(jù)庫(kù)中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問(wèn)system.profile
- userAdmin:允許用戶(hù)向system.users集合寫(xiě)入,可以找指定數(shù)據(jù)庫(kù)里創(chuàng)建、刪除和管理用戶(hù)
- clusterAdmin:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶(hù)所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限。
- readAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的讀權(quán)限
- readWriteAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的讀寫(xiě)權(quán)限
- userAdminAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的userAdmin權(quán)限
- dbAdminAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶(hù)所有數(shù)據(jù)庫(kù)的dbAdmin權(quán)限。
- root:只在admin數(shù)據(jù)庫(kù)中可用。超級(jí)賬號(hào),超級(jí)權(quán)限