正常安裝
- 下載軟件, 在MongoDB官網(wǎng) 下載安裝包mongodb-win32-x86_64-2008plus-ssl-3.4.3-signed
- 下載完成后開始安裝,我修改了安裝位置,放在了目錄“C:\mongodb”下面
- 一路next安裝完成。接下來是最有問題的設(shè)置MongoDB的服務(wù)。
- 在目錄“C:\mongodb”下創(chuàng)建data目錄和logs目錄,并在logs目錄下創(chuàng)建文件mongodb.log
- 在目錄“C:\mongodb”下創(chuàng)建mongodb.conf,并填入配置信息:
dbpath=C:\mongodb\data
logpath=C:\mongodb\logs\mongo.log
logappend=true
journal=true
quiet=true
port=27017
- 啟動(dòng)cmd界面,并執(zhí)行以下命令:
cd C:\mongodb\bin
mongod --config "C:\mongodb\mongo.conf" --logpath "C:\mongodb\logs\mongo.log" --install --serviceName "MongoDB"
mongod.exe --remove --serviceName "MongoDB" #如果需要移除這個(gè)服務(wù)的話
-
瀏覽器訪問http://127.0.0.1:27017即可看到以下界面
權(quán)限配置
MonogoDB默認(rèn)是無需權(quán)限認(rèn)證即可進(jìn)行CRUD操作的,但是為了保證MongoDB的使用尤其是商業(yè)使用,MongoDB應(yīng)該要求是做權(quán)限配置。
關(guān)于權(quán)限,需要理解:
- MongoDB是沒有默認(rèn)管理員賬號(hào),所以要先添加管理員賬號(hào),再開啟權(quán)限認(rèn)證。
- 切換到admin數(shù)據(jù)庫,添加的賬號(hào)才是管理員賬號(hào)。
- 用戶只能在用戶所在數(shù)據(jù)庫登錄,包括管理員賬號(hào)。
- 管理員可以管理所有數(shù)據(jù)庫,但是不能直接管理其他數(shù)據(jù)庫,要先在admin數(shù)據(jù)庫認(rèn)證后才可以。
MongoDB有默認(rèn)的角色參考官方文檔,也可以自定義角色,默認(rèn)的角色包括:
- 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:賦予用戶所有數(shù)據(jù)庫的讀權(quán)限
- readWriteAnyDatabase:賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限
- userAdminAnyDatabase:賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限
- dbAdminAnyDatabase:賦予用戶所有數(shù)據(jù)庫的dbAdmin權(quán)限。
- root:超級(jí)賬號(hào),超級(jí)權(quán)限
- __system權(quán)限 ,用于分布式環(huán)境的權(quán)限認(rèn)證,MongoDB assigns this role to user objects that represent cluster members, such as replica set members and mongos instances. The role entitles its holder to take any action against any object in the database.Do not assign this role to user objects representing applications or human administrators, other than in exceptional circumstances.If you need access to all actions on all resources, for example to run applyOps commands, do not assign this role. Instead, create a user-defined role that grants anyAction on anyResource and ensure that only the users who need access to these operations have this access.
上述的配置完成后,可以按照下面的操作進(jìn)行:
- 查看admin庫
C:\Users\kejun.he>mongo
> use admin
switched to db admin
> show collections
system.version
- 添加超級(jí)權(quán)限用戶sa,root用戶和admin用戶
> db.createUser(
{
user:"sa",
pwd:"root",
roles:["root"]
})
> db.createUser(
{
user:"root",
pwd:"root",
roles:["clusterAdmin", "readWriteAnyDatabase", "dbAdminAnyDatabase", "userAdminAnyDatabase"]
})
> db.createUser(
{
user:"admin",
pwd:"admin",
roles:[{role:"dbAdminAnyDatabase",db:"admin"}]
})
- 在我們之前配置的mongo.conf文件中增加這一句,并重啟mongoDB服務(wù)
auth=true
========================
net stop mongoDB
net start mongoDB
我們?cè)僦匦碌卿洠l(fā)現(xiàn)需要認(rèn)證的配置生效了,這時(shí)候需要通過認(rèn)證登錄:
C:\Users\kejun.he>mongo
MongoDB shell version v3.4.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.3
> show dbs
2017-04-25T13:04:34.435+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases:
1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:761:19
shellHelper@src/mongo/shell/utils.js:651:15
@(shellhelp2):1:1
在上面的代碼中,我們可看到需要檢查admin的權(quán)限,use admin之后不能直接查詢,通過權(quán)限認(rèn)證之后才能查看admin數(shù)據(jù)庫下的表。
* 繼續(xù)增加普通用戶,方便用戶訪問特定的數(shù)據(jù)庫
> use admin
> db.auth("admin","admin")
> use upwords
switched to db upwords
> db.createUser({
user:"up",
pwd:"up",
roles:[{role:"readWrite",db:"upwords"},{role:"dbAdmin",db:"upwords"}]
})
Successfully added user: {
"user" : "up",
"roles" : [
{
"role" : "readWrite",
"db" : "upwords"
},
{
"role" : "dbAdmin",
"db" : "upwords"
}
]
}
> use upwords
switched to db upwords
> db.auth("up","up")
1
> show collections
abc
test
顯示添加成功。
概念
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
-
RDBMS vs NoSQL
RDBMS- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語言(SQL) (SQL)
- 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。
- 數(shù)據(jù)操縱語言,數(shù)據(jù)定義語言
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)
NoSQL
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預(yù)定義的模式
- 鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫
- 最終一致性,而非ACID屬性
- 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
- CAP定理
- 高性能,高可用性和可伸縮性
-
NoSQL的優(yōu)點(diǎn)/缺點(diǎn)
優(yōu)點(diǎn):- 高可擴(kuò)展性
- 分布式計(jì)算
- 低成本
- 架構(gòu)的靈活性,半結(jié)構(gòu)化數(shù)據(jù)
- 沒有復(fù)雜的關(guān)系
缺點(diǎn):
- 沒有標(biāo)準(zhǔn)化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序
-
MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。主要特點(diǎn)包括:
- MongoDB的提供了一個(gè)面向文檔存儲(chǔ),操作起來比較簡(jiǎn)單和容易。
- 你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實(shí)現(xiàn)更快的排序。
- Mongo支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組。
- MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
- Mongodb中的Map/reduce主要是用來對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。
- Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。
- Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的,并可以通過db.runCommand或mapreduce命令來執(zhí)行MapReduce操作。
- GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
- MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。
- MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
MongoDB中,數(shù)據(jù)庫db=database,數(shù)據(jù)庫表table=collection,數(shù)據(jù)記錄行row=document,數(shù)據(jù)集字段column=field,索引index=index,自動(dòng)將_id字段設(shè)為主鍵,沒有join操作。文檔是一組鍵值對(duì),MongoDB的文檔不需要設(shè)置字段和字段類型,鍵值對(duì)是有序的,MongoDB不能有重復(fù)的鍵,文檔的鍵是字符串。除了少數(shù)例外情況,鍵可以使用任意UTF-8字符。
-
MongoDB中需要保留三個(gè)數(shù)據(jù)庫名,它們是安裝好創(chuàng)建并支持直接訪問:
- admin: 從權(quán)限的角度來看,這是"root"數(shù)據(jù)庫。要是將一個(gè)用戶添加到這個(gè)數(shù)據(jù)庫,這個(gè)用戶自動(dòng)繼承所有數(shù)據(jù)庫的權(quán)限。一些特定的服務(wù)器端命令也只能從這個(gè)數(shù)據(jù)庫運(yùn)行,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器。
- local: 這個(gè)數(shù)據(jù)永遠(yuǎn)不會(huì)被復(fù)制,可以用來存儲(chǔ)限于本地單臺(tái)服務(wù)器的任意集合。
- config: 當(dāng)Mongo用于分片設(shè)置時(shí),config數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的相關(guān)信息。
默認(rèn)創(chuàng)建collections和db的方法
使用use db_name默認(rèn)創(chuàng)建數(shù)據(jù)倉庫db_name,然后通過db.collection_name.insert(document)可以默認(rèn)創(chuàng)建collection