您好,登錄后才能下訂單哦!
一、概述
1.1 MongoDB概念
MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。在nosql數(shù)據(jù)庫(kù)里,大部分的查詢都是鍵值對(duì)(key、value)的方式。MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中最像關(guān)系數(shù)據(jù)庫(kù)的。其特征NoSQL、文檔存儲(chǔ)、Json數(shù)據(jù)模型、支持事務(wù)。
1.2 NoSQL概念
NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫(kù)。NoSQL有時(shí)也稱作Not Only SQL的縮寫(xiě),是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)管理系統(tǒng)的統(tǒng)稱。
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)。(例如谷歌或Facebook每天為他們的用戶收集萬(wàn)億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展。
1.3 NoSQL的特征
高擴(kuò)展性:Nosql去掉了關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性,易于橫向擴(kuò)展。
高性能:Nosql通過(guò)簡(jiǎn)單的key-value方式獲取數(shù)據(jù),非??焖?。還有NoSQL的Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以NoSQL在這個(gè)層面上來(lái)說(shuō)就要性能高很多。
靈活的數(shù)據(jù)模型:相對(duì)于關(guān)系數(shù)據(jù)庫(kù)里,增刪字段的繁瑣,NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。
高可用:NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)。比如mongodb通過(guò)mongos、config server replica set,shard就可以快速配置出高可用配置。
1.4 NoSQL分類
類型 | 部分代表 | 特點(diǎn) |
列存儲(chǔ) | Hbase Cassandra Hypertable | 顧名思義,是按列存儲(chǔ)數(shù)據(jù)的。最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì)。 |
文檔存儲(chǔ) | MongoDB CouchDB | 文檔存儲(chǔ)一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的某些功能。 |
key-value存儲(chǔ) | Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB | 可以通過(guò)key快速查詢到其value。一般來(lái)說(shuō),存儲(chǔ)不管value的格式,照單全收。(Redis包含了其他功能) |
圖存儲(chǔ) | Neo4J FlockDB | 圖形關(guān)系的最佳存儲(chǔ)。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)來(lái)解決的話性能低下,而且設(shè)計(jì)使用不方便。 |
對(duì)象存儲(chǔ) | db4o Versant | 通過(guò)類似面向?qū)ο笳Z(yǔ)言的語(yǔ)法操作數(shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù)。 |
xml數(shù)據(jù)庫(kù) | Berkeley DB XML BaseX | 高效的存儲(chǔ)XML數(shù)據(jù),并支持XML的內(nèi)部查詢語(yǔ)法,比如XQuery,Xpath。 |
1.5 MongoDB概念解析
在mongodb中基本的概念是文檔、集合、數(shù)據(jù)庫(kù),對(duì)應(yīng)與關(guān)系型數(shù)據(jù)庫(kù)如下表:
SQL術(shù)語(yǔ)/概念 | MongoDB術(shù)語(yǔ)/概念 | 解釋/說(shuō)明 |
---|---|---|
database | database | 數(shù)據(jù)庫(kù) |
table | collection | 數(shù)據(jù)庫(kù)表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
數(shù)據(jù)庫(kù):一個(gè)MongoDB 實(shí)例可以承載多個(gè)數(shù)據(jù)庫(kù)。它們之間可以看作相互獨(dú)立,每個(gè)數(shù)據(jù)庫(kù)都有獨(dú)立的權(quán)限控制。在磁盤(pán)上,不同的數(shù)據(jù)庫(kù)存放在不同的文件中。MongoDB 中存在以下系統(tǒng)數(shù)據(jù)庫(kù)。
Admin 數(shù)據(jù)庫(kù):一個(gè)權(quán)限數(shù)據(jù)庫(kù),如果創(chuàng)建用戶的時(shí)候?qū)⒃撚脩籼砑拥絘dmin 數(shù)據(jù)庫(kù)中,那么該用戶就自動(dòng)繼承了所有數(shù)據(jù)庫(kù)的權(quán)限。
Local 數(shù)據(jù)庫(kù):這個(gè)數(shù)據(jù)庫(kù)永遠(yuǎn)不會(huì)被負(fù)責(zé),可以用來(lái)存儲(chǔ)本地單臺(tái)服務(wù)器的任意集合。
Config 數(shù)據(jù)庫(kù):當(dāng)MongoDB 使用分片模式時(shí),config 數(shù)據(jù)庫(kù)在內(nèi)部使用,用于保存分片的信息。
集合:集合就是一組文檔,類似于關(guān)系數(shù)據(jù)庫(kù)中的表。集合是無(wú)模式的,集合中的文檔可以是各式各樣的。在MongoDB中集合用collections表示,每個(gè)
collection用一個(gè)名字標(biāo)識(shí),需要注意以下幾點(diǎn):
名字不允許是空字符串""
名字不能包含\0字符,因?yàn)樗硎久值慕Y(jié)束
不能創(chuàng)建以system.開(kāi)頭的
文檔:文檔是 MongoDB 中數(shù)據(jù)的基本單位,類似于關(guān)系數(shù)據(jù)庫(kù)中的行(但是比行復(fù)雜)。多個(gè)鍵及其關(guān)聯(lián)的值有序地放在一起就構(gòu)成了文檔。
文檔中的鍵/值對(duì)是有序的。
文檔中的值不僅可以是在雙引號(hào)里面的字符串,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個(gè)嵌入的文檔)。
MongoDB區(qū)分類型和大小寫(xiě)。
MongoDB的文檔不能有重復(fù)的鍵。
文檔的鍵是字符串。除了少數(shù)例外情況,鍵可以使用任意UTF-8字符。
二、安裝部署
2.1 配置yum安裝
配置mongodb的yum源進(jìn)行安裝
cat >/etc/yum.repos.d/mongodb.repo<<EOF [mongodb] name=MongoDB Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/ gpgcheck=0 enabled=1 EOF yum clean all && yum makecache yum install -y mongo-10gen mongo-10gen-server
2.2 下載安裝包安裝
cd /usr/local/ wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgz #下載軟件包 tar -zxvf mongodb-linux-x86_64-rhel62-3.4.10.tgz ln -sv mongodb-linux-x86_64-rhel62-3.4.10 mongodb mkdir /usr/local/mongodb/{conf,mongoData,mongoLog} #創(chuàng)建數(shù)據(jù),日志,配置文件目錄 touch /usr/local/mongodb/mongoLog/mongodb.log #創(chuàng)建日志文件 echo "export PATH=\$PATH:/usr/local/mongodb/bin">/etc/profile.d/mongodb.sh source /etc/profile.d/mongodb.sh #配置環(huán)境變量
命令行啟動(dòng):
mongod --httpinterface --dbpath /usr/local/mongodb/mongoData --logpath /usr/local/mongodb/mongoLog/mongodb.log --fork
將啟動(dòng)的各項(xiàng)參數(shù)寫(xiě)入配置文件啟動(dòng)
cat>/usr/local/mongodb/conf/mongodb.conf<<EOF dbpath=/usr/local/mongodb/mongoData #數(shù)據(jù)存儲(chǔ)目錄 logpath=/usr/local/mongodb/mongoLog/mongodb.log #日志文件 logappend=true # 使用追加的方式寫(xiě)日志 journal=true quiet=true port=27017 #端口 maxConns=20000 #最大連接數(shù) httpinterface=true #開(kāi)啟web界面端口為:28017 fork=true #以守護(hù)進(jìn)程的方式運(yùn)行MongoDB EOF mongod -f /usr/local/mongodb/conf/mongodb.conf #指定配置文件啟動(dòng)
2.3 mongod配置參數(shù)詳解
--quiet | # 安靜輸出 |
--port arg | # 指定服務(wù)端口號(hào),默認(rèn)端口27017 |
--bind_ip arg | # 綁定服務(wù)IP,若綁定127.0.0.1,則只能本機(jī)訪問(wèn),不指定默認(rèn)本地所有IP |
--logpath arg | # 指定MongoDB日志文件,注意是指定文件不是目錄 |
--logappend | # 使用追加的方式寫(xiě)日志 |
--pidfilepath arg | # PID File 的完整路徑,如果沒(méi)有設(shè)置,則沒(méi)有PID文件 |
--keyFile arg | # 集群的私鑰的完整路徑,只對(duì)于Replica Set 架構(gòu)有效 |
--unixSocketPrefix arg | # UNIX域套接字替代目錄,(默認(rèn)為 /tmp) |
--fork | # 以守護(hù)進(jìn)程的方式運(yùn)行MongoDB,創(chuàng)建服務(wù)器進(jìn)程 |
--auth | # 啟用驗(yàn)證 |
--cpu | # 定期顯示CPU的CPU利用率和iowait |
--dbpath arg | # 指定數(shù)據(jù)庫(kù)路徑 |
--diaglog arg | # diaglog選項(xiàng) 0=off 1=W 2=R 3=both 7=W+some reads |
--directoryperdb | # 設(shè)置每個(gè)數(shù)據(jù)庫(kù)將被保存在一個(gè)單獨(dú)的目錄 |
--journal | # 啟用日志選項(xiàng),MongoDB的數(shù)據(jù)操作將會(huì)寫(xiě)入到j(luò)ournal文件夾的文件里 |
--journalOptions arg | # 啟用日志診斷選項(xiàng) |
--ipv6 | # 啟用IPv6選項(xiàng) |
--jsonp | # 允許JSONP形式通過(guò)HTTP訪問(wèn)(有安全影響) |
--maxConns arg | # 最大同時(shí)連接數(shù) 默認(rèn)2000 |
--noauth | # 不啟用驗(yàn)證 |
--nohttpinterface | # 關(guān)閉http接口,默認(rèn)關(guān)閉27018端口訪問(wèn) |
--noprealloc | # 禁用數(shù)據(jù)文件預(yù)分配(往往影響性能) |
--noscripting | # 禁用腳本引擎 |
--notablescan | # 不允許表掃描 |
--nounixsocket | # 禁用Unix套接字監(jiān)聽(tīng) |
--nssize arg (=16) | # 設(shè)置信數(shù)據(jù)庫(kù).ns文件大小(MB) |
--objcheck | # 在收到客戶數(shù)據(jù),檢查的有效性, |
--profile arg | # 檔案參數(shù) 0=off 1=slow, 2=all |
--quota | # 限制每個(gè)數(shù)據(jù)庫(kù)的文件數(shù),設(shè)置默認(rèn)為8 |
--quotaFiles arg | # number of files allower per db, requires --quota |
--rest | # 開(kāi)啟簡(jiǎn)單的rest API |
--repair | # 修復(fù)所有數(shù)據(jù)庫(kù)run repair on all dbs |
--repairpath arg | # 修復(fù)庫(kù)生成的文件的目錄,默認(rèn)為目錄名稱dbpath |
--slowms arg (=100) | # value of slow for profile and console log |
--smallfiles | # 使用較小的默認(rèn)文件 |
--syncdelay arg (=60) | # 數(shù)據(jù)寫(xiě)入磁盤(pán)的時(shí)間秒數(shù)(0=never,不推薦) |
--sysinfo | # 打印一些診斷系統(tǒng)信息 |
--upgrade | # 如果需要升級(jí)數(shù)據(jù)庫(kù) |
* Replicaton 參數(shù)
--fastsync | # 從一個(gè)dbpath里啟用從庫(kù)復(fù)制服務(wù),該dbpath的數(shù)據(jù)庫(kù)是主庫(kù)的快照,可用于快速啟用同步 |
--autoresync | # 如果從庫(kù)與主庫(kù)同步數(shù)據(jù)差得多,自動(dòng)重新同步, |
--oplogSize arg | # 設(shè)置oplog的大小(MB) |
* 主/從參數(shù)
--master | # 主庫(kù)模式 |
--slave | # 從庫(kù)模式 |
--source arg | # 從庫(kù) 端口號(hào) |
--only arg | # 指定單一的數(shù)據(jù)庫(kù)復(fù)制 |
--slavedelay arg | # 設(shè)置從庫(kù)同步主庫(kù)的延遲時(shí)間 |
* Replica set(副本集)選項(xiàng):
--replSet arg | # 設(shè)置副本集名稱 |
* Sharding(分片)選項(xiàng)
--configsvr | # 聲明這是一個(gè)集群的config服務(wù),默認(rèn)端口27019,默認(rèn)目錄/data/configdb |
--shardsvr | # 聲明這是一個(gè)集群的分片,默認(rèn)端口27018 |
--noMoveParanoia | # 關(guān)閉偏執(zhí)為moveChunk數(shù)據(jù)保存 |
三、基礎(chǔ)操作
3.1 數(shù)據(jù)庫(kù)操作
a.創(chuàng)建數(shù)據(jù)庫(kù)
MongoDB 創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)法格式如下:
use DATABASE_NAME #如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù)。
use dbtest; > db dbtest > show dbs; #查看數(shù)據(jù)庫(kù) admin 0.000GB dbtest 0.000GB local 0.000GB
b.刪除數(shù)據(jù)庫(kù)
MongoDB 刪除數(shù)據(jù)庫(kù)的語(yǔ)法格式如下:
db.dropDatabase()
> use dbtest; switched to db dbtest > db.dropDatabase() { "dropped" : "dbtest", "ok" : 1 } > show dbs; admin 0.000GB local 0.000GB
3.2 集合操作
a.創(chuàng)建集合
db.createCollection(name,options)
db.createCollection("user",autoindexID=true)
capped:類型為 Boolean,如果為 true 則創(chuàng)建一個(gè)固定大小的集合,當(dāng)其條目達(dá)到最大時(shí)可以自動(dòng)覆蓋以前的條目。在設(shè)置其為 true 時(shí)也要指定參數(shù)大??;
autoIndexID:類型為 Boolean,默認(rèn)為 false,如果設(shè)置為 true,則會(huì)在 _id field.s 上自動(dòng)創(chuàng)建索引;
size:如果 capped 為 true 需要指定,指定參數(shù)的最大值,單位為 byte;
max:指定最大的文檔數(shù)。 在 Mongodb 中也可以不用創(chuàng)建集合,因?yàn)樵趧?chuàng)建文檔的時(shí)候也會(huì)自動(dòng)的創(chuàng)建集合。
> db.createCollection("user",autoindexID=true) #創(chuàng)建集合user { "ok" : 1 } > show collections; #查看集合 user
b.刪除集合
db.collection.drop()
> show collections; user > db.user.drop() true > show collections
3.3 文檔操作
a.插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔
db.COLLECTION_NAME.insert(document)
> db.user.insert({name:"kaliarch",age:30}) #insert 插入文檔 WriteResult({ "nInserted" : 1 }) > db.user.insert({name:"xuel",age:31}) WriteResult({ "nInserted" : 1 }) > db.user.save({name:"anchnet",age:34}) #save插入文檔 WriteResult({ "nInserted" : 1 }) > db.user.find() #查看文檔 { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
db.collection.insertOne():向指定集合中插入一條文檔數(shù)據(jù)
db.collection.insertMany():向指定集合中插入多條文檔數(shù)據(jù)
b.更新文檔
MongoDB 使用 update() 和 save() 方法來(lái)更新集合中的文檔
--------------------------------------update方式-----------------------------------------
update()方式 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> })
參數(shù)說(shuō)明:
query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
update : update的對(duì)象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內(nèi)set后面的
upsert : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來(lái)多條記錄全部更新。
writeConcern :可選,拋出異常的級(jí)別。
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.update({"name":"xuel"},{$set:{"name":"udxuel"}}) #更新name WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "udxuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
-----------------------------------------save方式--------------------------------------
save()方式 db.collection.save( <document>, { writeConcern: <document> })
參數(shù)說(shuō)明:
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級(jí)別。
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "udxuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.save({ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 }) #更新name WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
c.刪除文檔
remove() 方法的基本語(yǔ)法格式如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> })
參數(shù)說(shuō)明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。
writeConcern :(可選)拋出異常的級(jí)別。
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.remove({"name":"xuel","age":31}) #刪除文檔 WriteResult({ "nRemoved" : 1 }) > db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
d.查看文檔
db.collection.find(query, projection)
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。
可以使用 pretty() 方法,語(yǔ)法格式如下:
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.find().pretty() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
3.4 條件操作符
條件操作符用于比較兩個(gè)表達(dá)式并從mongoDB集合中獲取數(shù)據(jù)
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
(=)等于- $eq
(!=)不等于-$ne
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } { "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50 } > db.user.find({"age":{$gt:33}}) #查詢age大于33的文檔 { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } { "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50 } > db.user.find({"age":{$lt:33}}) #查詢age小于33的文檔 { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } > db.user.find({"age":{$eq:34}}) #查詢age等于33的文檔 { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.find({"age":{$ne:10}}) 、#查詢age不等于10的文檔 { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } { "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50
3.5 創(chuàng)建索引
索引通常能夠極大的提高查詢的效率,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)
MongoDB使用 ensureIndex() 方法來(lái)創(chuàng)建索引。
>db.COLLECTION_NAME.ensureIndex({KEY:1})
語(yǔ)法中 Key 值為你要?jiǎng)?chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來(lái)創(chuàng)建索引指定為-1即可。
ensureIndex() 方法中你也可以設(shè)置使用多個(gè)字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫(kù)中稱作復(fù)合索引)。
db.mycol.ensureIndex({"title":1,"description":-1})
3.6 備份恢復(fù)
a.mongodb數(shù)據(jù)備份
mongodump命令腳本語(yǔ)法如下:
mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服務(wù)器地址,例如:127.0.0.1,當(dāng)然也可以指定端口號(hào):127.0.0.1:27017
-d:
需要備份的數(shù)據(jù)庫(kù)實(shí)例,例如:test
-o:
備份的數(shù)據(jù)存放位置,例如:c:\data\dump,當(dāng)然該目錄需要提前建立,在備份完成后,系統(tǒng)自動(dòng)在dump目錄下建立一個(gè)test目錄,這個(gè)目錄里面存放該數(shù)據(jù)庫(kù)實(shí)例的備份數(shù)據(jù)。
語(yǔ)法 | 描述 | 實(shí)例 |
---|---|---|
mongodump --host HOST_NAME --port PORT_NUMBER | 該命令將備份所有MongoDB數(shù)據(jù) | mongodump --host localhost --port 27017 |
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY | mongodump --dbpath /data/db/ --out /data/backup/ | |
mongodump --collection COLLECTION --db DB_NAME | 該命令將備份指定數(shù)據(jù)庫(kù)的集合。 | mongodump --collection mycol --db test |
b.mongodb數(shù)據(jù)恢復(fù)
mongorestore命令腳本語(yǔ)法如下:
>mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:
MongoDB所在服務(wù)器地址,默認(rèn)為: localhost:27017
--db , -d :
需要恢復(fù)的數(shù)據(jù)庫(kù)實(shí)例,例如:test,當(dāng)然這個(gè)名稱也可以和備份時(shí)候的不一樣,比如test2
--drop:
恢復(fù)的時(shí)候,先刪除當(dāng)前數(shù)據(jù),然后恢復(fù)備份的數(shù)據(jù)。就是說(shuō),恢復(fù)后,備份后添加修改的數(shù)據(jù)都會(huì)被刪除,慎用哦!
<path>:
mongorestore 最后的一個(gè)參數(shù),設(shè)置備份數(shù)據(jù)所在位置,例如:/tmp/testdb
你不能同時(shí)指定 <path> 和 --dir 選項(xiàng),--dir也可以設(shè)置備份目錄。
--dir:
指定備份的目錄
你不能同時(shí)指定 <path> 和 --dir 選項(xiàng)。
此時(shí)查看數(shù)據(jù)已經(jīng)正?;謴?fù)。
3.7 密碼權(quán)限
為mongodb設(shè)置密碼,需要進(jìn)行auth啟動(dòng),在配置文件添加auth=true
a.設(shè)置數(shù)據(jù)庫(kù)管理員
> use admin switched to db admin > db.createUser({user:"root",pwd:"mongopwd",roles:["userAdminAnyDatabase"]}) #創(chuàng)建用戶密碼,并設(shè)置權(quán)限 Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] } > db.auth("root","mongopwd") #認(rèn)證,返回1為認(rèn)證成功 1
認(rèn)證通過(guò)進(jìn)入數(shù)據(jù)庫(kù)db.auth 也可以在登錄的時(shí)候直接指定用戶名密碼登錄
mongo -u root -p mongopwd --authenticationDatabase admin
b.創(chuàng)建數(shù)據(jù)庫(kù)用戶
> use test switched to db test > db test > db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]}) Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] } > db.auth("testuser","testpass") 1
四、自動(dòng)備份腳本
最后寫(xiě)一個(gè)mongodb自動(dòng)備份腳本,配合crond來(lái)定時(shí)備份數(shù)據(jù)
github地址
#!/bin/bash #auth:xuel@anchnet.com #backup mongodb . /etc/profile CMD=`which mongodump` DATE=`date +%F` DB="test" DB_HOST="localhost" DB_PORT="27017" DB_USER="testuser" DB_PWD="testpass" BACKUP_DIR="/data/mongodb/" TAR_DIR="/data/tardir/" TAR_DIR_DATE="${TAR_DIR}${DATE}" TAR_BAK="mongodb_bak_$DATE.tar.gz" check_dir(){ for DIR in ${BACKUP_DIR} ${TAR_DIR_DATE} do if [ ! -d $DIR ];then mkdir -p $DIR fi done } backup_mongodb(){ $CMD -h ${DB_HOST}:${DB_PORT} -u $DB_USER -p $DB_PWD -d ${DB} -o ${BACKUP_DIR}${DATE} >/dev/null if [ $? -eq 0 ];then tar -zcf ${TAR_DIR_DATE}/${TAR_BAK} ${BACKUP_DIR}${DATE} && return 0 fi } clean_tar() { find ${TAR_DIR} -mtime +7 -exec rm -rf {} \; && return 0 } main() { check_dir [ $? -eq 0 ] && backup_mongodb [ $? -eq 0 ] && clean_tar } main
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。